<?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[Synchronisierung...]]></title><description><![CDATA[<p>Hi!</p>
<p>Mein Programm startet drei weitere Threads und wartet dann auf ein Event zum Beenden. Zwei dieser drei Threads sollen das Event signalisieren können.<br />
Aber SetEvent() ist doch nicht threadsafe...</p>
<p>Wie soll ich das jetzt machen? Mit einer CriticalSection zwischen den zwei SetEvent() aufrufen?</p>
<p>Also nochmal:</p>
<p>- MainThread:<br />
CreateThread(threadHandle1);<br />
CreateThread(threadHandle2);<br />
CreateThread(threadHandle3);<br />
WaitForSingleObject(closeEvent, INFINITE);<br />
TerminateThread(thread1Handle);<br />
TerminateThread(thread2Handle);<br />
TerminateThread(thread3Handle);</p>
<p>- Thread 1:<br />
while(true)<br />
recv(...);</p>
<p>- Thread 2:<br />
WaitForSingleObject(processHandle1, INFINITE);<br />
SetEvent(closeEvent);</p>
<p>- Thread 3:<br />
WaitForSingleObject(processHandle2, INFINITE);<br />
SetEvent(closeEvent);</p>
<p>(Das Programm soll solange empfangen, bis sich mindestens ein Prozess schließt)</p>
<p>So, also Thread 2 und 3 könnten doch gleichzeitig auf SetEvent() zugreifen.<br />
Was muss ich jetzt beachten? Hab sowas noch nie gemacht...<br />
Oder soll ich das ganz anders machen?</p>
<p>Achja, noch was:<br />
Es heißt ja, TerminateThread() sei unsauber. Aber wie soll ich es denn sonst machen, sind schließlich alles blocking calls...</p>
<p>Danke!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/228714/synchronisierung</link><generator>RSS for Node</generator><lastBuildDate>Fri, 10 Apr 2026 13:11:01 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/228714.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 02 Dec 2008 04:04:49 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Synchronisierung... on Tue, 02 Dec 2008 04:04:49 GMT]]></title><description><![CDATA[<p>Hi!</p>
<p>Mein Programm startet drei weitere Threads und wartet dann auf ein Event zum Beenden. Zwei dieser drei Threads sollen das Event signalisieren können.<br />
Aber SetEvent() ist doch nicht threadsafe...</p>
<p>Wie soll ich das jetzt machen? Mit einer CriticalSection zwischen den zwei SetEvent() aufrufen?</p>
<p>Also nochmal:</p>
<p>- MainThread:<br />
CreateThread(threadHandle1);<br />
CreateThread(threadHandle2);<br />
CreateThread(threadHandle3);<br />
WaitForSingleObject(closeEvent, INFINITE);<br />
TerminateThread(thread1Handle);<br />
TerminateThread(thread2Handle);<br />
TerminateThread(thread3Handle);</p>
<p>- Thread 1:<br />
while(true)<br />
recv(...);</p>
<p>- Thread 2:<br />
WaitForSingleObject(processHandle1, INFINITE);<br />
SetEvent(closeEvent);</p>
<p>- Thread 3:<br />
WaitForSingleObject(processHandle2, INFINITE);<br />
SetEvent(closeEvent);</p>
<p>(Das Programm soll solange empfangen, bis sich mindestens ein Prozess schließt)</p>
<p>So, also Thread 2 und 3 könnten doch gleichzeitig auf SetEvent() zugreifen.<br />
Was muss ich jetzt beachten? Hab sowas noch nie gemacht...<br />
Oder soll ich das ganz anders machen?</p>
<p>Achja, noch was:<br />
Es heißt ja, TerminateThread() sei unsauber. Aber wie soll ich es denn sonst machen, sind schließlich alles blocking calls...</p>
<p>Danke!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1624062</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1624062</guid><dc:creator><![CDATA[lobold]]></dc:creator><pubDate>Tue, 02 Dec 2008 04:04:49 GMT</pubDate></item><item><title><![CDATA[Reply to Synchronisierung... on Tue, 02 Dec 2008 07:16:20 GMT]]></title><description><![CDATA[<p>Sicherlich ist SetEvent Threadsafe.<br />
Wieso denkst Du das es das nicht wäre?<br />
Was für eine Art von Event nutzt Du? Ich vermute mal das es ein manual-reset Event ist!</p>
<p>Du setzt den Close Event und die anderen Threads &quot;sollten&quot; terminieren.</p>
<p>BTW: Yet another reason to not use blocking sockets...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1624094</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1624094</guid><dc:creator><![CDATA[Martin Richter]]></dc:creator><pubDate>Tue, 02 Dec 2008 07:16:20 GMT</pubDate></item><item><title><![CDATA[Reply to Synchronisierung... on Tue, 02 Dec 2008 07:37:07 GMT]]></title><description><![CDATA[<p>Warum sicher? Keine Ahnung, wo steht das?<br />
Ja, manual-reset, war nur einmal so dass der Prozess nicht mehr beendet hat und process explorer hat 0 threads angezeigt...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1624103</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1624103</guid><dc:creator><![CDATA[lobold]]></dc:creator><pubDate>Tue, 02 Dec 2008 07:37:07 GMT</pubDate></item><item><title><![CDATA[Reply to Synchronisierung... on Tue, 02 Dec 2008 08:13:09 GMT]]></title><description><![CDATA[<p>Weil Crisitcalsections, Events und Mutexe die Kernfunktionen der Threadsynchronisation sind. Schau doch einfach in die MSDN! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
<p>Du findest SetEvent in der Gruppe der Synchronisationsbefehle:<br />
<a href="http://msdn.microsoft.com/en-us/library/ms681924(VS.85).aspx" rel="nofollow">http://msdn.microsoft.com/en-us/library/ms681924(VS.85).aspx</a><br />
Es steht auch in der Beschrebung, dass mehrere Threads auf einen Event warten können!</p>
<p>Was glaubst Du denn, was passiert wenn SetEvent nicht threadsafe wäre?</p>
<p>In Deinem Fal tut es sogar evtl. sogar eine Variable <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="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1624118</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1624118</guid><dc:creator><![CDATA[Martin Richter]]></dc:creator><pubDate>Tue, 02 Dec 2008 08:13:09 GMT</pubDate></item><item><title><![CDATA[Reply to Synchronisierung... on Tue, 02 Dec 2008 17:45:06 GMT]]></title><description><![CDATA[<p>Ich dachte eben so, dass man SetEvent() eben zur Synchronisation verwendet, aber man SetEvent() SELBST auch noch synchronisieren muss <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>Eine Variable? Das wäre doch nicht threadsafe <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1624518</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1624518</guid><dc:creator><![CDATA[lobold]]></dc:creator><pubDate>Tue, 02 Dec 2008 17:45:06 GMT</pubDate></item><item><title><![CDATA[Reply to Synchronisierung... on Tue, 02 Dec 2008 19:24:24 GMT]]></title><description><![CDATA[<p>lobold schrieb:</p>
<blockquote>
<p>Ich dachte eben so, dass man SetEvent() eben zur Synchronisation verwendet, aber man SetEvent() SELBST auch noch synchronisieren muss <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>Eine Variable? Das wäre doch nicht threadsafe <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /></p>
</blockquote>
<p>Warum ist das nicht threadsafe. Wenn Du nur etwas signalisieren möchtest wie Ende für alle Threads?<br />
Dann setzt Du das und jeder kann es abfragen und bekommt die gleicheInfo. Warum soll das nicht threadsafe sein?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1624564</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1624564</guid><dc:creator><![CDATA[Martin Richter]]></dc:creator><pubDate>Tue, 02 Dec 2008 19:24:24 GMT</pubDate></item><item><title><![CDATA[Reply to Synchronisierung... on Tue, 02 Dec 2008 21:29:31 GMT]]></title><description><![CDATA[<p>Tja, dann habe ich zu wenig Wissen.<br />
Ich dachte, man müsse alle gleichzeitigen Zugriffe auf ein und dieselbe Variable absichern, also ne critical section setzen zB...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1624617</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1624617</guid><dc:creator><![CDATA[lobold]]></dc:creator><pubDate>Tue, 02 Dec 2008 21:29:31 GMT</pubDate></item></channel></rss>