<?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[Deadlock?]]></title><description><![CDATA[<p>Hallo!</p>
<p>Ich frage mich, warum dieser Code manchmal einen Deadlock erzeugt (Der Prozess bleibt dann im Process Explorer sichtbar, er hat aber 0 Threads...)?</p>
<pre><code class="language-cpp">void* closeEvent = CreateEvent(0, true, false, 0);

unsigned long __stdcall Thread1(void* param)
{
	SetEvent(closeEvent);
	return 0;
}

unsigned long __stdcall Thread2(void* param)
{
	SetEvent(closeEvent);
	return 0;
}

int main()
{
	void* threadHandle1 = CreateThread(0, 0, static_cast&lt;PTHREAD_START_ROUTINE&gt;(Thread1), 0, 0, 0);
	void* threadHandle2 = CreateThread(0, 0, static_cast&lt;PTHREAD_START_ROUTINE&gt;(Thread2), 0, 0, 0);

	WaitForSingleObject(closeEvent, INFINITE);

	TerminateThread(threadHandle1, 0);
	TerminateThread(threadHandle2, 0);
	CloseHandle(threadHandle1);
	CloseHandle(threadHandle2);
}
</code></pre>
<p><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>
]]></description><link>https://www.c-plusplus.net/forum/topic/229188/deadlock</link><generator>RSS for Node</generator><lastBuildDate>Fri, 10 Apr 2026 07:21:03 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/229188.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 08 Dec 2008 17:08:13 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Deadlock? on Mon, 08 Dec 2008 17:08:13 GMT]]></title><description><![CDATA[<p>Hallo!</p>
<p>Ich frage mich, warum dieser Code manchmal einen Deadlock erzeugt (Der Prozess bleibt dann im Process Explorer sichtbar, er hat aber 0 Threads...)?</p>
<pre><code class="language-cpp">void* closeEvent = CreateEvent(0, true, false, 0);

unsigned long __stdcall Thread1(void* param)
{
	SetEvent(closeEvent);
	return 0;
}

unsigned long __stdcall Thread2(void* param)
{
	SetEvent(closeEvent);
	return 0;
}

int main()
{
	void* threadHandle1 = CreateThread(0, 0, static_cast&lt;PTHREAD_START_ROUTINE&gt;(Thread1), 0, 0, 0);
	void* threadHandle2 = CreateThread(0, 0, static_cast&lt;PTHREAD_START_ROUTINE&gt;(Thread2), 0, 0, 0);

	WaitForSingleObject(closeEvent, INFINITE);

	TerminateThread(threadHandle1, 0);
	TerminateThread(threadHandle2, 0);
	CloseHandle(threadHandle1);
	CloseHandle(threadHandle2);
}
</code></pre>
<p><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>
]]></description><link>https://www.c-plusplus.net/forum/post/1627124</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1627124</guid><dc:creator><![CDATA[Sentenza]]></dc:creator><pubDate>Mon, 08 Dec 2008 17:08:13 GMT</pubDate></item><item><title><![CDATA[Reply to Deadlock? on Mon, 08 Dec 2008 17:17:29 GMT]]></title><description><![CDATA[<p>Ich glaube es liegt an:</p>
<p>MSDN &quot;If the target thread is executing certain kernel32 calls when it is terminated, the kernel32 state for the thread's process could be inconsistent&quot;</p>
<p>Dazu gleich noch eine Frage:<br />
Der Code oben ist ein Minimalbeispiel. In meinem Programm macht ein Thread einen blocking call. Dann MUSS ich doch aber TerminateThread() aufrufen um das Programm zu beenden, oder?</p>
<p>(Komischerweise beendet das Minimalbeispiel oben auch wenn ich in Thread 1 eine Endlosschleife einbaue und die TerminateThread()- Aufrufe weglasse. Aber warum?)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1627132</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1627132</guid><dc:creator><![CDATA[Sentenza]]></dc:creator><pubDate>Mon, 08 Dec 2008 17:17:29 GMT</pubDate></item><item><title><![CDATA[Reply to Deadlock? on Mon, 08 Dec 2008 17:39:46 GMT]]></title><description><![CDATA[<p>Never Ever call &quot;TerminateThread&quot;!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1627140</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1627140</guid><dc:creator><![CDATA[Jochen Kalmbach]]></dc:creator><pubDate>Mon, 08 Dec 2008 17:39:46 GMT</pubDate></item><item><title><![CDATA[Reply to Deadlock? on Mon, 08 Dec 2008 17:43:36 GMT]]></title><description><![CDATA[<p>Okay, aber ich hatte in Erinnerung dass ein Prozess bestehen bleibt bis der aller letzte Thread beendet wurde...</p>
<p>Dem ist aber anscheinend nicht so, ist das 100% sicher? Werden alle Threads automatisch beendet, sobald die Main- Funktion zurückkehrt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1627144</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1627144</guid><dc:creator><![CDATA[Sentenza]]></dc:creator><pubDate>Mon, 08 Dec 2008 17:43:36 GMT</pubDate></item><item><title><![CDATA[Reply to Deadlock? on Mon, 08 Dec 2008 18:55:50 GMT]]></title><description><![CDATA[<p>Sentenza schrieb:</p>
<blockquote>
<p>Okay, aber ich hatte in Erinnerung dass ein Prozess bestehen bleibt bis der aller letzte Thread beendet wurde...</p>
<p>Dem ist aber anscheinend nicht so, ist das 100% sicher? Werden alle Threads automatisch beendet, sobald die Main- Funktion zurückkehrt?</p>
</blockquote>
<p>Ein Prozess belibt wirklich so lange bestehen bis der letzte Thread termniert.<br />
Das Problem ist, dass dr CRT bei verlassen der main Funktion exit aufruft, und dies Funktion ruft ExitProcess auf, und das beendet den Prozess und damit alles Threads.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1627192</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1627192</guid><dc:creator><![CDATA[Martin Richter]]></dc:creator><pubDate>Mon, 08 Dec 2008 18:55:50 GMT</pubDate></item><item><title><![CDATA[Reply to Deadlock? on Mon, 08 Dec 2008 19:09:06 GMT]]></title><description><![CDATA[<p>Ist das jetzt ein Widerspruch oder meinst du mit &quot;Ein Prozess belibt wirklich so lange bestehen bis der letzte Thread termniert&quot; dass die Threads beendet werden aber halt währenddessen auf sie gewartet wird..?</p>
<p>Doch bitte sagt mir eins, es wird mir einfach nicht klar:</p>
<pre><code class="language-cpp">unsigned long __stdcall Thread1(void* param)
{
	// Hier eine nicht wegoptimierte Endlosschleife

	return 0;
}

unsigned long __stdcall Thread2(void* param)
{
	// Hier einen Blocking Call, zB. ReadFile aus einer Pipe

	return 0;
}

int main()
{
	void* threadHandle1 = CreateThread(0, 0, static_cast&lt;PTHREAD_START_ROUTINE&gt;(Thread1), 0, 0, 0);
	void* threadHandle2 = CreateThread(0, 0, static_cast&lt;PTHREAD_START_ROUTINE&gt;(Thread2), 0, 0, 0);
}
</code></pre>
<p>Wenn nur thread 1 gestartet wird, beendet sich der Prozess.<br />
Wenn nur thread 2 gestartet wird, beendet sich der Prozess nicht!</p>
<p>Wo ist da der Unterschied, Endlosschleife und Blocking Call?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1627202</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1627202</guid><dc:creator><![CDATA[Sentenza]]></dc:creator><pubDate>Mon, 08 Dec 2008 19:09:06 GMT</pubDate></item><item><title><![CDATA[Reply to Deadlock? on Mon, 08 Dec 2008 20:38:57 GMT]]></title><description><![CDATA[<p>Es ist gar kein Widerspruch.<br />
1. Durch die Verwednung der CRT wird Dein Prpgramm bei return aus main beendet! Egal wieviele Threads existieren.<br />
2. Deine zweites Beispiel kann nie blockieren, denn jeder der Threads startet und endetsofort.<br />
3. Würdest Du am Ende Deiner Main Funktion ExitThread verwenden, dann würde in jedem Fall Dein Programm solange laufen bis der letzte Thread terminiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1627258</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1627258</guid><dc:creator><![CDATA[Martin Richter]]></dc:creator><pubDate>Mon, 08 Dec 2008 20:38:57 GMT</pubDate></item><item><title><![CDATA[Reply to Deadlock? on Tue, 09 Dec 2008 01:09:39 GMT]]></title><description><![CDATA[<p>Der Thread mit dem blocking call blockiert aber...<br />
Der Prozess bleibt sichtbar, mit 0 Threads...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1627395</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1627395</guid><dc:creator><![CDATA[Sentenza]]></dc:creator><pubDate>Tue, 09 Dec 2008 01:09:39 GMT</pubDate></item><item><title><![CDATA[Reply to Deadlock? on Tue, 09 Dec 2008 06:50:54 GMT]]></title><description><![CDATA[<p>Sentenza schrieb:</p>
<blockquote>
<p>Der Thread mit dem blocking call blockiert aber...<br />
Der Prozess bleibt sichtbar, mit 0 Threads...</p>
</blockquote>
<p>Ich habe Deine Kommentare nicht gelesen.<br />
Dadurch das Du in main returnierst wird ExitProcess aufgerufen, das beendet alle laufenden Threads!<br />
Hättest Du ExitThread am Ende der main Funktion verwendet, hätten die anderen Threads Deinen Prozess am Leben erhalten.</p>
<p>Drücke ich mich so unklar aus?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1627426</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1627426</guid><dc:creator><![CDATA[Martin Richter]]></dc:creator><pubDate>Tue, 09 Dec 2008 06:50:54 GMT</pubDate></item><item><title><![CDATA[Reply to Deadlock? on Tue, 09 Dec 2008 07:26:24 GMT]]></title><description><![CDATA[<p>Siehe: When does a program terminate?<br />
<a href="http://blog.kalmbachnet.de/?postid=65" rel="nofollow">http://blog.kalmbachnet.de/?postid=65</a></p>
<p>Der Prozess wird beendet, wenn *alle* Threads beendet sind, oder ExitProcess/TerminateProcess aufgerufen wird (direkt oder z.B. indirekt über Ctrl-C bei Consolen-Programme) oder der Rechner runtergefahren wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1627439</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1627439</guid><dc:creator><![CDATA[Jochen Kalmbach]]></dc:creator><pubDate>Tue, 09 Dec 2008 07:26:24 GMT</pubDate></item><item><title><![CDATA[Reply to Deadlock? on Tue, 09 Dec 2008 08:44:44 GMT]]></title><description><![CDATA[<p>Martin, Jochen, ihr solltet schon lesen was der schreibt bevor ihr zum 3. mal dasselbe antwortet <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/1627471</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1627471</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 09 Dec 2008 08:44:44 GMT</pubDate></item><item><title><![CDATA[Reply to Deadlock? on Tue, 09 Dec 2008 09:24:28 GMT]]></title><description><![CDATA[<p>Offensichtlich wird ExitProcess aufgerufen und der kann nicht terminiert werden, weil der Thread noch eine System-Ressource blockiert, die entweder ExitProcess auch benötigt, oder die zuvor freigegeben werden muss.<br />
Hier kann alles im Spiel sein: DLLs für die DllMain aufegrufen wird etc...</p>
<p>Grundsätzlich: So beendet man kein Programm, wenn noch andere eigene Threads laufen, die Systemressourcen nutzen! :xmas1:</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1627495</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1627495</guid><dc:creator><![CDATA[Martin Richter]]></dc:creator><pubDate>Tue, 09 Dec 2008 09:24:28 GMT</pubDate></item><item><title><![CDATA[Reply to Deadlock? on Tue, 09 Dec 2008 10:32:37 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/13960">@hustbaer</a>: Es gab IMHO zwei Fragen:</p>
<blockquote>
<p>1. Der Prozess bleibt dann im Process Explorer sichtbar, er hat aber 0 Threads<br />
2. Komischerweise beendet das Minimalbeispiel oben auch wenn ich in Thread 1 eine Endlosschleife einbaue und die TerminateThread()- Aufrufe weglasse. Aber warum?)</p>
</blockquote>
<p>Meine Antwort war auf die 2. Frage bezogen...</p>
<p>Die 1. Frage hat er sich ja schon selber beantwortet, oder?</p>
<blockquote>
<p>MSDN &quot;If the target thread is executing certain kernel32 calls when it is terminated, the kernel32 state for the thread's process could be inconsistent&quot;</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/1627519</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1627519</guid><dc:creator><![CDATA[Jochen Kalmbach]]></dc:creator><pubDate>Tue, 09 Dec 2008 10:32:37 GMT</pubDate></item><item><title><![CDATA[Reply to Deadlock? on Wed, 10 Dec 2008 02:39:54 GMT]]></title><description><![CDATA[<p>Wie soll man ein Programm mit einem Blocking Call in einem Thread beenden? Der Prozess beendet nicht, wenn ich ein blocking ReadFile() in einem Thread habe... (Wiegesagt, 0 Threads im process explorer, aber Prozess beendet sich nicht)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1627965</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1627965</guid><dc:creator><![CDATA[Sentenza]]></dc:creator><pubDate>Wed, 10 Dec 2008 02:39:54 GMT</pubDate></item><item><title><![CDATA[Reply to Deadlock? on Wed, 10 Dec 2008 07:18:15 GMT]]></title><description><![CDATA[<p>Du musst abwarten bis der Blocking Call zurück kommt und dann dem Thread mitteilen, dass er sich beenden soll. Bei z.B. &quot;ReadFile&quot; könntest Du auch versuchen in einem anderen Thread das Handle mittels &quot;CloseHandle&quot; zu schliessen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1627989</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1627989</guid><dc:creator><![CDATA[Jochen Kalmbach]]></dc:creator><pubDate>Wed, 10 Dec 2008 07:18:15 GMT</pubDate></item></channel></rss>