<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[try-catch und multithreading]]></title><description><![CDATA[<p>moin moin!</p>
<p>hätte da mal wieder ne frage: ist try catch unter win eigentlich thread safe??<br />
ich hab da nämlich 2 threads laufen die beide verschiedene instanzen einer Socket-Klasse nutzen:</p>
<p>ein_thread_der_was_macht-&gt;socketinstanz1<br />
ein_thread_der_was_ganz_anderes_macht-&gt;socketinstanz2</p>
<p>wenn nun ein_thread_der_was_macht bzw dessen socketinstanz1 eine exception wirft, fängt ein_thread_der_was_ganz_anderes_macht diese in seinem try-catch block für socketinstanz2 auf <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
<p>warum?</p>
<p>thx schon mal <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/topic/115243/try-catch-und-multithreading</link><generator>RSS for Node</generator><lastBuildDate>Thu, 02 Jul 2026 16:13:49 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/115243.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 12 Jul 2005 18:04:36 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to try-catch und multithreading on Tue, 12 Jul 2005 18:04:36 GMT]]></title><description><![CDATA[<p>moin moin!</p>
<p>hätte da mal wieder ne frage: ist try catch unter win eigentlich thread safe??<br />
ich hab da nämlich 2 threads laufen die beide verschiedene instanzen einer Socket-Klasse nutzen:</p>
<p>ein_thread_der_was_macht-&gt;socketinstanz1<br />
ein_thread_der_was_ganz_anderes_macht-&gt;socketinstanz2</p>
<p>wenn nun ein_thread_der_was_macht bzw dessen socketinstanz1 eine exception wirft, fängt ein_thread_der_was_ganz_anderes_macht diese in seinem try-catch block für socketinstanz2 auf <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
<p>warum?</p>
<p>thx schon mal <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/829480</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/829480</guid><dc:creator><![CDATA[sn0b]]></dc:creator><pubDate>Tue, 12 Jul 2005 18:04:36 GMT</pubDate></item><item><title><![CDATA[Reply to try-catch und multithreading on Tue, 12 Jul 2005 19:25:49 GMT]]></title><description><![CDATA[<p>hm. alos das sieht dann so aus:</p>
<p>*** Socket (1): Constructor()...<br />
*** Socket (1): InitWSA()...<br />
*** Socket (2): Constructor()...<br />
*** Socket (2): InitWSA()...<br />
threadsocket 2: connecting...<br />
threadsocket 1: connecting...<br />
*** Socket (2): Connect()...<br />
*** Socket (1): Connect()...<br />
*** Socket (1): throwing exception at Connect()<br />
threadsocket 2: SocketException at Socket.Connect():Ein Verbindungsversuch ist<br />
fehlgeschlagen, da die Gegenstelle nach einer bestimmten Zeitspanne nicht ordnun<br />
gsgemõ▀ reagiert hat, oder die hergestellte Verbindung war fehlerhaft, da der ve<br />
rbundene Host nicht reagiert hat. Error Code: 10060</p>
<p>jemand vielleicht n plan woran das liegen könnte?<br />
ich benutze dev-cpp und die threads sowie das socket sind reine winapi:<br />
soll ich mal den source posten?? kann mir dann vielleicht jemand helfen??</p>
<p>mfg</p>
]]></description><link>https://www.c-plusplus.net/forum/post/829547</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/829547</guid><dc:creator><![CDATA[sn0b]]></dc:creator><pubDate>Tue, 12 Jul 2005 19:25:49 GMT</pubDate></item><item><title><![CDATA[Reply to try-catch und multithreading on Tue, 12 Jul 2005 19:52:31 GMT]]></title><description><![CDATA[<p>vielleicht ist das zufall weil beide sockets sich gleichzeitig connecten und beide den selben timeout-wert haben. teste doch mal indem sich einer etwas später connected ob das immer noch passiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/829573</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/829573</guid><dc:creator><![CDATA[net 0]]></dc:creator><pubDate>Tue, 12 Jul 2005 19:52:31 GMT</pubDate></item><item><title><![CDATA[Reply to try-catch und multithreading on Tue, 12 Jul 2005 20:34:03 GMT]]></title><description><![CDATA[<p>das hab ich ja schon <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":-("
      alt="😞"
    /> der 1. thread &quot;sleept&quot; 1000ms der 2. 5000...<br />
außerdem werden dann beide threads beendet, obwohl ja der 1.thread dann ja noch wenigstenes auf die exceptions des socket2 warten müßte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/829648</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/829648</guid><dc:creator><![CDATA[sn0b]]></dc:creator><pubDate>Tue, 12 Jul 2005 20:34:03 GMT</pubDate></item><item><title><![CDATA[Reply to try-catch und multithreading on Wed, 13 Jul 2005 10:56:25 GMT]]></title><description><![CDATA[<p>hab das problem jetzt mal eingekreist:</p>
<p>Thread.h</p>
<pre><code class="language-cpp">#ifndef _THREAD_
#define _THREAD_

#include &lt;windows.h&gt;

namespace mylib {

    class Thread {

        private:
            HANDLE h;
            bool running;
            unsigned int id;
            int stoptimeout;
            int killtimeout;

        public:
            /* Ctor: */
            Thread();

            /* Ctor: */
            Thread(const unsigned int &amp;id);

            /* Ctor: */
            Thread(const int &amp;s, const int &amp;k);

            /* Ctor: */
            Thread(const unsigned int &amp;id, const int &amp;s, const int &amp;k);

            /* Dtor: */
            virtual ~Thread();

            /* Thread starten. (User) */
            virtual void Start();

            /* Thread beenden. (User) */
            virtual void Stop();

            /* Hier drin alles... */
            virtual unsigned int Run();

            /* Thread weich stoppen lassen. */
            virtual void SetRunning(const bool &amp;r);

            /* Läuft der Thread? */
            virtual bool IsRunning() const;

            virtual int GetId() const;

            virtual void SetStopTimeout(const int &amp;t);
            virtual void SetKillTimeout(const int &amp;t);

            virtual const int &amp;GetStopTimeout() const;
            virtual const int &amp;GetKillTimeout() const;

        private:
            /* Thread killen. */
            virtual void Kill();

            /* Instanz erzeugen */
            static unsigned _stdcall StartThread(void*);
    };

} 

#endif // _THREAD_
</code></pre>
<p>Thread.cpp</p>
<pre><code class="language-cpp">#include &quot;Thread.h&quot;
#include &lt;process.h&gt;

using namespace mylib;

/****************************** public: ******************************/

Thread::Thread() {
    running=false;
    id=0;
    stoptimeout=2000;
    killtimeout=2000;
}

Thread::Thread(const unsigned int &amp;id) {
    running=false;
    this-&gt;id=id;
    stoptimeout=2000;
    killtimeout=2000;
}

Thread::Thread(const int &amp;s, const int &amp;k) {
    running=false;
    stoptimeout=s;
    killtimeout=k;
}

Thread::Thread(const unsigned int &amp;id, const int &amp;s, const int &amp;k) {
    running=false;
    this-&gt;id=id;
    stoptimeout=s;
    killtimeout=k;
}

Thread::~Thread() {
    if (running) Kill(); // Thread muß beendet sein, BEVOR
    CloseHandle(h);
}

void Thread::Start() {
    if (running) return;
    running=true;

    // Thread erzeugen, &quot;this&quot; als PVOID Thread-Parameter übergeben
    h=(HANDLE)_beginthreadex(0,0,StartThread,this,0,0);
}

void Thread::Stop() /*throw(ThreadException)*/ {
    if (!running) return;
    running=false;

    // Warten das Thread beendet ist:
    if (!WaitForSingleObject(h, stoptimeout)==ERROR_SUCCESS) Kill();
    CloseHandle(h);
}

unsigned int Thread::Run() {
    /* ... */
    return 0;
}

void Thread::SetRunning(const bool &amp;r) {
    running=r;
}

bool Thread::IsRunning() const {
    return running;
}

int Thread::GetId() const {
    return id;
}

void Thread::SetStopTimeout(const int &amp;s) {
    stoptimeout=s;
}

void Thread::SetKillTimeout(const int &amp;k) {
    killtimeout=k;
}

const int &amp;Thread::GetStopTimeout() const {
    return stoptimeout;
}

const int &amp;Thread::GetKillTimeout() const {
    return killtimeout;
}

/****************************** private: ******************************/

void Thread::Kill() {
    running=false;

    // Warten das Thread beendet ist:
    WaitForSingleObject(h, killtimeout);
    // statt dessen evtl. Wait mit timeout + TerminateThread falls nicht von allein
    if (!TerminateThread(h, 0)) {
        CloseHandle(h);

    }
    CloseHandle(h);
}

unsigned _stdcall Thread::StartThread(void* threadobj) {
    Thread *instance=static_cast&lt;Thread*&gt;(threadobj);
    return instance-&gt;Run();
}
</code></pre>
<p>threadtest.h</p>
<pre><code class="language-cpp">#include &quot;Thread.h&quot;

class threadtest : public mylib::Thread {
    public:
        threadtest(int &amp;id) :Thread(id) {
        }
        ~threadtest() {
            printf(&quot;threadtest %d: destructing...\n&quot;,GetId());
        }

        unsigned int Run() {
            try {
                if (GetId()==1) {
                    printf(&quot;threadtest %d: Sleeping()...\n&quot;,GetId());
                    Sleep(5000);
                }
                else Sleep(10000);

                int i;
                printf(&quot;threadtest %d: throwing...\n&quot;,GetId());
                throw (i);

            catch (const int &amp;i) {
                printf(&quot;threadtest %d: Error!!\n&quot;,GetId());
            }
            printf(&quot;threadtest %d: quiting...\n&quot;,GetId());
            return 0;
        }

};
</code></pre>
<p>main.cpp</p>
<pre><code class="language-cpp">#include &quot;threadtest.h&quot;

int main(int argc, char *argv[])
{

    int i=1;
    threadtest t1(i);
    i=2;
    threadtest t2(i);

    t1.Start();
    t2.Start();

    Sleep(30000);

    t1.Stop();
    t2.Stop();

    system(&quot;PAUSE&quot;);
    return EXIT_SUCCESS;
}
</code></pre>
<p>dies führt dann zu der ausgabe:<br />
threadsocket 1: Sleeping()...<br />
threadsocket 1: throwing...<br />
threadsocket 2: Error!!<br />
threadsocket 2: quiting...</p>
<p>argh!! ich raste bald aus! warum passiert das???</p>
]]></description><link>https://www.c-plusplus.net/forum/post/830084</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/830084</guid><dc:creator><![CDATA[sn0b]]></dc:creator><pubDate>Wed, 13 Jul 2005 10:56:25 GMT</pubDate></item><item><title><![CDATA[Reply to try-catch und multithreading on Wed, 13 Jul 2005 11:05:34 GMT]]></title><description><![CDATA[<p>poste nicht soviel unnützen code sondern das nur wichtigste</p>
]]></description><link>https://www.c-plusplus.net/forum/post/830092</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/830092</guid><dc:creator><![CDATA[triggert]]></dc:creator><pubDate>Wed, 13 Jul 2005 11:05:34 GMT</pubDate></item><item><title><![CDATA[Reply to try-catch und multithreading on Wed, 13 Jul 2005 11:51:19 GMT]]></title><description><![CDATA[<p>wieso unnützer code? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /><br />
das ist ja schon das wichtigste!<br />
meine thread klasse will halt wohl irgendwie nicht.<br />
ich versuchs nochmal zu reduzieren:</p>
<p>Thread.h</p>
<pre><code class="language-cpp">#ifndef _THREAD_
#define _THREAD_

#include &lt;windows.h&gt;

namespace mylib {
    class Thread {
        private:
            HANDLE h;
            bool running;
            unsigned int id;
            int stoptimeout;
            int killtimeout;

        public:
            /* Ctor: */
            Thread();
            /* Ctor: */
            Thread(const unsigned int &amp;id);

            /* Dtor: */
            virtual ~Thread();

            /* Thread starten. */
            virtual void Start();

            /* Thread beenden. */
            virtual void Stop();

            /* Hier drin alles... */
            virtual unsigned int Run();

            /* Thread weich stoppen lassen. */
            virtual void SetRunning(const bool &amp;r);
            /* Läuft der Thread? */
            virtual bool IsRunning() const;

            virtual int GetId() const;

        private:
            /* Thread killen. */
            virtual void Kill();

            /* Instanz erzeugen */
            static unsigned _stdcall StartThread(void*);
    };
} 
#endif // _THREAD_
</code></pre>
<p>Thread.cpp</p>
<pre><code class="language-cpp">#include &quot;Thread.h&quot;
#include &lt;process.h&gt;

using namespace mylib;

/****************************** public: ******************************/

Thread::Thread() {
    running=false;
    id=0;
    stoptimeout=2000;
    killtimeout=2000;
}

Thread::Thread(const unsigned int &amp;id) {
    running=false;
    this-&gt;id=id;
    stoptimeout=2000;
    killtimeout=2000;
}

Thread::~Thread() {
    if (running) Kill(); // Thread muß beendet sein, BEVOR
    CloseHandle(h);
}

void Thread::Start() {
    if (running) return;
    running=true;

    // Thread erzeugen, &quot;this&quot; als PVOID Thread-Parameter übergeben
    h=(HANDLE)_beginthreadex(0,0,StartThread,this,0,0);
}

void Thread::Stop() {
    if (!running) return;
    running=false;

    // Warten das Thread beendet ist:
    if (!WaitForSingleObject(h, stoptimeout)==ERROR_SUCCESS) Kill();
    CloseHandle(h);
}

unsigned int Thread::Run() {
    /* ... */
    return 0;
}

void Thread::SetRunning(const bool &amp;r) {
    running=r;
}

bool Thread::IsRunning() const {
    return running;
}

int Thread::GetId() const {
    return id;
}

/****************************** private: ******************************/

void Thread::Kill() {
    running=false;

    // Warten das Thread beendet ist:
    WaitForSingleObject(h, killtimeout);
    if (!TerminateThread(h, 0)) {
        CloseHandle(h);

    }
    CloseHandle(h);
}

unsigned _stdcall Thread::StartThread(void* threadobj) {
    Thread *instance=static_cast&lt;Thread*&gt;(threadobj);
    return instance-&gt;Run();
}
</code></pre>
<p>so das ist jetzt minimaler. dachte ich poste ein kompilierbares vollständiges beispiel, damit man denn fehler besser sieht. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
<p>bitte hilf mir jemand!!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/830132</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/830132</guid><dc:creator><![CDATA[sn0b]]></dc:creator><pubDate>Wed, 13 Jul 2005 11:51:19 GMT</pubDate></item><item><title><![CDATA[Reply to try-catch und multithreading on Wed, 13 Jul 2005 18:51:15 GMT]]></title><description><![CDATA[<p>falls es jemanden interessiert:<br />
der fehler liegt wohl an dev-cpp bzw dessen library. mit visual c++ läuft der selbe source ohne probleme...<img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /><br />
werde jetzt mal gucken was sich da machen läßt</p>
]]></description><link>https://www.c-plusplus.net/forum/post/830610</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/830610</guid><dc:creator><![CDATA[sn0b]]></dc:creator><pubDate>Wed, 13 Jul 2005 18:51:15 GMT</pubDate></item><item><title><![CDATA[Reply to try-catch und multithreading on Wed, 13 Jul 2005 19:06:13 GMT]]></title><description><![CDATA[<p>Boost-Threads?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/830626</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/830626</guid><dc:creator><![CDATA[FireFlow]]></dc:creator><pubDate>Wed, 13 Jul 2005 19:06:13 GMT</pubDate></item><item><title><![CDATA[Reply to try-catch und multithreading on Wed, 13 Jul 2005 19:21:38 GMT]]></title><description><![CDATA[<p>FireFlow schrieb:</p>
<blockquote>
<p>Boost-Threads?</p>
</blockquote>
<p>ja hab ich auch schon überlegt. die boost-lib ist ja auch portabel oder? und muß auf dem zielsystem nicht zwingend installiert sein oder?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/830639</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/830639</guid><dc:creator><![CDATA[sn0b]]></dc:creator><pubDate>Wed, 13 Jul 2005 19:21:38 GMT</pubDate></item><item><title><![CDATA[Reply to try-catch und multithreading on Wed, 13 Jul 2005 19:22:48 GMT]]></title><description><![CDATA[<p>sn0b schrieb:</p>
<blockquote>
<p>FireFlow schrieb:</p>
<blockquote>
<p>Boost-Threads?</p>
</blockquote>
<p>ja hab ich auch schon überlegt. die boost-lib ist ja auch portabel oder? und muß auf dem zielsystem nicht zwingend installiert sein oder?</p>
</blockquote>
<p>Wenn du es statisch dazulinkst nicht. Die Boost-Threads laufen jedenfalls auf Linux und Windows mehr kann ich nicht sagen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/830642</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/830642</guid><dc:creator><![CDATA[FireFlow]]></dc:creator><pubDate>Wed, 13 Jul 2005 19:22:48 GMT</pubDate></item><item><title><![CDATA[Reply to try-catch und multithreading on Wed, 13 Jul 2005 19:53:50 GMT]]></title><description><![CDATA[<p>löl. ich habs jetzt gefunden. (ganz ohne euch :p )<br />
zum compiler aufruf muß -mthreads hinzugefügt werden.<br />
komischerweise lief multithreading ohne exceptions auch ohne diesen parameter ohne probleme... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /> naja jetzt läuft auch das<br />
<img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f576.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--sunglasses"
      title=":sunglasses:"
      alt="🕶"
    /></p>
<p>an alle trotzdem thx fürs lesen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /><br />
cu</p>
]]></description><link>https://www.c-plusplus.net/forum/post/830678</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/830678</guid><dc:creator><![CDATA[sn0b]]></dc:creator><pubDate>Wed, 13 Jul 2005 19:53:50 GMT</pubDate></item></channel></rss>