Deadlock?
-
Sentenza schrieb:
Okay, aber ich hatte in Erinnerung dass ein Prozess bestehen bleibt bis der aller letzte Thread beendet wurde...
Dem ist aber anscheinend nicht so, ist das 100% sicher? Werden alle Threads automatisch beendet, sobald die Main- Funktion zurückkehrt?
Ein Prozess belibt wirklich so lange bestehen bis der letzte Thread termniert.
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.
-
Ist das jetzt ein Widerspruch oder meinst du mit "Ein Prozess belibt wirklich so lange bestehen bis der letzte Thread termniert" dass die Threads beendet werden aber halt währenddessen auf sie gewartet wird..?
Doch bitte sagt mir eins, es wird mir einfach nicht klar:
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<PTHREAD_START_ROUTINE>(Thread1), 0, 0, 0); void* threadHandle2 = CreateThread(0, 0, static_cast<PTHREAD_START_ROUTINE>(Thread2), 0, 0, 0); }Wenn nur thread 1 gestartet wird, beendet sich der Prozess.
Wenn nur thread 2 gestartet wird, beendet sich der Prozess nicht!Wo ist da der Unterschied, Endlosschleife und Blocking Call?
-
Es ist gar kein Widerspruch.
1. Durch die Verwednung der CRT wird Dein Prpgramm bei return aus main beendet! Egal wieviele Threads existieren.
2. Deine zweites Beispiel kann nie blockieren, denn jeder der Threads startet und endetsofort.
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.
-
Der Thread mit dem blocking call blockiert aber...
Der Prozess bleibt sichtbar, mit 0 Threads...
-
Sentenza schrieb:
Der Thread mit dem blocking call blockiert aber...
Der Prozess bleibt sichtbar, mit 0 Threads...Ich habe Deine Kommentare nicht gelesen.
Dadurch das Du in main returnierst wird ExitProcess aufgerufen, das beendet alle laufenden Threads!
Hättest Du ExitThread am Ende der main Funktion verwendet, hätten die anderen Threads Deinen Prozess am Leben erhalten.Drücke ich mich so unklar aus?
-
Siehe: When does a program terminate?
http://blog.kalmbachnet.de/?postid=65Der 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.
-
Martin, Jochen, ihr solltet schon lesen was der schreibt bevor ihr zum 3. mal dasselbe antwortet

-
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.
Hier kann alles im Spiel sein: DLLs für die DllMain aufegrufen wird etc...Grundsätzlich: So beendet man kein Programm, wenn noch andere eigene Threads laufen, die Systemressourcen nutzen! :xmas1:
-
@hustbaer: Es gab IMHO zwei Fragen:
1. Der Prozess bleibt dann im Process Explorer sichtbar, er hat aber 0 Threads
2. Komischerweise beendet das Minimalbeispiel oben auch wenn ich in Thread 1 eine Endlosschleife einbaue und die TerminateThread()- Aufrufe weglasse. Aber warum?)Meine Antwort war auf die 2. Frage bezogen...
Die 1. Frage hat er sich ja schon selber beantwortet, oder?
MSDN "If the target thread is executing certain kernel32 calls when it is terminated, the kernel32 state for the thread's process could be inconsistent"
-
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)
-
Du musst abwarten bis der Blocking Call zurück kommt und dann dem Thread mitteilen, dass er sich beenden soll. Bei z.B. "ReadFile" könntest Du auch versuchen in einem anderen Thread das Handle mittels "CloseHandle" zu schliessen.