Thread Management
-
Weil der Code innerhalb der Laufzeitbibliothek vereinfacht so aussieht:
void mainCRTStartup() { int ret = main(...); ExitProcess(ret); }Ohne den Aufruf von ExitProcesss würde der Prozess (unter Windows) weiterlaufen.
-
Welche Laufzeitbibliothek verdammt nochmal -.-
Bei MinGW exakt selbes verhalten.
-
Ihr habt also quasi recht wenn ihr sagt "unter C++ ist das so".
Aber das ist nicht das Verhalten des Betriebssystems.
-
Wie kann man das deaktivieren?
-
314159265358979 schrieb:
Welche Laufzeitbibliothek verdammt nochmal -.-
Bei MinGW exakt selbes verhalten.Die Laufzeitbibliothen, die auch main() aufruft verdammt nochmal

Was du schreibst ist Unsinn, sorry.
Windows beendet den Prozess nur dann "von selbst", wenn der letzte Thread beendet wurde, egal welcher Thread das ist.
Dass mit MSVC und MinGW hier das selbe passiert, nämlich das Programm beendet wird wenn die main() Funktion verlassen wird, ist wohl kaum ein Beweis dafür, dass Windows dies machen würde. Das ist einfach so, weil die CRT von sowohl MSVC als auch MinGW hier das selbe tun, nämlich EndProcess aufzurufen.
ps.: deaktivieren kann man das soweit ich weiss gar nicht. Aber du kannst ein Programm schreiben das die CRT nicht verwendet - such dir die passenden Linker-Flags raus wenn du es probieren willst. Dann wirst sehen, dass Windows sich herzlich wenig darum schert welche Threads noch laufen, so lange noch wenigstens ein laufender Thread da ist.
-
Hm, ok, und wenn ich das Verhalten nicht haben will?
-
314159265358979 schrieb:
Hm, ok, und wenn ich das Verhalten nicht haben will?
Dann musst du in der Doku deiner C++ Implementierung schaun wie du das abschalten kannst, was normalerweise wohl bedeutet dass du auf die Runtime verzichten musst.
-
also habs getested wenn ich ein thread starte und aus dem wieder threads hervorgehen und ich das 1. thread aus dem die anderen gestartet wurden terminiere dann laufen die anderen noch weiter. gibts da ne möglichkeit sie zu beenden wenn der "main" thread auch terminiert wird?
-
du darfst den 1. Thread nicht per TerminateThread beenden, sondern anders...
-
und wie?
-
Ein Thread beendet wenn seine ThreadProc returned. Wenn du willst dass ein Thread beendet dann musst du also dafür sorgen dass seine ThreadProc returned, fertig.
-
ja schon klar aber ich hab ja aus dem thread z.b. 5 weitere threads gestartet wie kann ich jetzt die beenen?
-
CreateEvent, SetEvent, WaitForSingleObject
-
spike1993 schrieb:
ja schon klar aber ich hab ja aus dem thread z.b. 5 weitere threads gestartet wie kann ich jetzt die beenen?
Indem du denen irgendwie ein Signal gibst dass sie beenden sollen. Stichwort Synchronisation und so: http://msdn.microsoft.com/en-us/library/ms686689.aspx
-
hätte es mit bool schon versucht aber da gibts sicher ne bessere lösung
-
Vor allem ist ein einfacher bool problematisch. http://en.wikipedia.org/wiki/Race_condition#Computing
-
weis jm ne bessere lösung?
-
spike1993 schrieb:
weis jm ne bessere lösung?
Wie wärs wenn du die ganzen Links auch mal durchliest, ansonsten frag ich mich schon für was ich hier eigentlich poste. Ich geb dir noch ein paar Stichwörter: Critical Section, Atomic Operation, Mutex, Condition Variable. Und das sind jetzt nicht irgendwelche leeren Buzzwords die ich mir hier einfach mal zum Spaß aus den Fingern sauge. Wenn du dich mit Multithreading beschäftigen willst dann sind das essentielle Konzepte.
Noch ein paar Links die interessant sind:
http://de.wikipedia.org/wiki/Interprozesskommunikation
http://de.wikipedia.org/wiki/Race_Condition
http://de.wikipedia.org/wiki/Philosophenproblem
http://de.wikipedia.org/wiki/Erzeuger-Verbraucher-Problem
-
ich kriebs einfach nicht hin mit was fürn einer funktion api muss ich den handle vom thread den beenden damit auch die threads beendet werden die aus dem 1. gestartet werden.
-
Wie oft soll ichs noch sagen: Der einzige richtige Weg um einen Thread zu beenden ist dass der Thread sich selbst beendet indem er returned. Wenn du willst dass alle diese Threads beenden dann musst du dafür sorgen dass diese Threads sich beenden indem du diese Threads alle entsprechend programmierst. period.