<?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[2 Threads synchronisieren]]></title><description><![CDATA[<p>Hallo zusammen.</p>
<p>Mein Programm besitzt einen Fensterthread und einen Workerthread. Das ganze läuft einwandfrei, bis ich das Programm beende. Dann nämlich muss der Fensterthread den Workerthread beenden. Zwar tritt der Fehler relativ selten auf, aber auch das ist nicht annehmbar.<br />
Ich habe die ganze Sache synchronisiert und meiner Meinung nach dürfte der Fensterthread nicht fortfahren, bis der Workerthread terminiert worden ist.<br />
Ich skiziere noch kurz den Ablauf beim Beenden:<br />
Die erst DLL beendet über den Fensterthread den Worker Thread, der in der zweiten DLL läuft, dann wird die 2. DLL entladen. Danach löscht der der Fensterthread die gemeinsamen Resourcen und entladet danach die erste DLL.<br />
Trotz dieser Reihenfolge greift der Worker Thread manchmal auf die gemeinsamen Resourcen zu, nachdem er beendet worden sein sollte. Wie kann das sein?! Ich synchronisiere ja die ganze Sache, so dass der Haupt Thread ja gar nicht die Resourcen löschen kann, bevor der Worker Thread die Schleife beendet hat, wo er auf die Resourcen zugreifen kann!!!</p>
<p>Fensterthread :</p>
<pre><code class="language-cpp">cs.Lock(); //CCriticalSection
die = true; 
cs.Unlock(); 
WaitForSingleObject(thread, INFINITE); //thread == Workerthread (HANDLE)
</code></pre>
<p>Workerthread:</p>
<pre><code class="language-cpp">while(true) { 
  cs.Lock(); 
  if(die) { 
    cs.Unlock(); 
    return; 
  } 
  //Zugriff auf gem. Resourcen 
  cs.Unlock(); 
}
</code></pre>
<p>Meiner Meinung nach sollte es nur eine mögliche Situationen geben:<br />
1. Workerthread besitzt das Lock, Hauptthread muss warten. (ev. bekommt der Hauptthread das Lock sofort, dann weiter bei 3.)<br />
2. Workerthread gibt Lock frei, Hauptthread übernimmt. Workerthread muss warten.<br />
3. Hauptthread setzt &quot;die&quot; auf true, gibt Lock frei, wartet auf Terminierung vom Workerthread. Workerthread terminiert. Hauptthread löscht Resourcen.</p>
<p>Meine Annahme scheint mir sehr logisch. Ist da vielleicht etwas mit der CCriticalSection nich i.O???</p>
<p>Bin für jeden Hinweis, oder Idee dankbar.<br />
Grz daboss</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/68223/2-threads-synchronisieren</link><generator>RSS for Node</generator><lastBuildDate>Sat, 06 Jun 2026 16:25:45 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/68223.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 16 Mar 2004 08:27:01 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to 2 Threads synchronisieren on Tue, 16 Mar 2004 08:27:01 GMT]]></title><description><![CDATA[<p>Hallo zusammen.</p>
<p>Mein Programm besitzt einen Fensterthread und einen Workerthread. Das ganze läuft einwandfrei, bis ich das Programm beende. Dann nämlich muss der Fensterthread den Workerthread beenden. Zwar tritt der Fehler relativ selten auf, aber auch das ist nicht annehmbar.<br />
Ich habe die ganze Sache synchronisiert und meiner Meinung nach dürfte der Fensterthread nicht fortfahren, bis der Workerthread terminiert worden ist.<br />
Ich skiziere noch kurz den Ablauf beim Beenden:<br />
Die erst DLL beendet über den Fensterthread den Worker Thread, der in der zweiten DLL läuft, dann wird die 2. DLL entladen. Danach löscht der der Fensterthread die gemeinsamen Resourcen und entladet danach die erste DLL.<br />
Trotz dieser Reihenfolge greift der Worker Thread manchmal auf die gemeinsamen Resourcen zu, nachdem er beendet worden sein sollte. Wie kann das sein?! Ich synchronisiere ja die ganze Sache, so dass der Haupt Thread ja gar nicht die Resourcen löschen kann, bevor der Worker Thread die Schleife beendet hat, wo er auf die Resourcen zugreifen kann!!!</p>
<p>Fensterthread :</p>
<pre><code class="language-cpp">cs.Lock(); //CCriticalSection
die = true; 
cs.Unlock(); 
WaitForSingleObject(thread, INFINITE); //thread == Workerthread (HANDLE)
</code></pre>
<p>Workerthread:</p>
<pre><code class="language-cpp">while(true) { 
  cs.Lock(); 
  if(die) { 
    cs.Unlock(); 
    return; 
  } 
  //Zugriff auf gem. Resourcen 
  cs.Unlock(); 
}
</code></pre>
<p>Meiner Meinung nach sollte es nur eine mögliche Situationen geben:<br />
1. Workerthread besitzt das Lock, Hauptthread muss warten. (ev. bekommt der Hauptthread das Lock sofort, dann weiter bei 3.)<br />
2. Workerthread gibt Lock frei, Hauptthread übernimmt. Workerthread muss warten.<br />
3. Hauptthread setzt &quot;die&quot; auf true, gibt Lock frei, wartet auf Terminierung vom Workerthread. Workerthread terminiert. Hauptthread löscht Resourcen.</p>
<p>Meine Annahme scheint mir sehr logisch. Ist da vielleicht etwas mit der CCriticalSection nich i.O???</p>
<p>Bin für jeden Hinweis, oder Idee dankbar.<br />
Grz daboss</p>
]]></description><link>https://www.c-plusplus.net/forum/post/481461</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/481461</guid><dc:creator><![CDATA[daboss]]></dc:creator><pubDate>Tue, 16 Mar 2004 08:27:01 GMT</pubDate></item></channel></rss>