Beenden eines Threads
Das Beenden eines Threads hat die folgenden Ergebnisse:
- Alle Ressourcen im Besitz des Threads, z. B. Fenster und Hooks, werden freigegeben.
- Der Threadendungscode ist festgelegt.
- Das Threadobjekt wird signalisiert.
- Wenn der Thread der einzige aktive Thread im Prozess ist, wird der Prozess beendet. Weitere Informationen finden Sie unter Beenden eines Prozesses.
Die GetExitCodeThread-Funktion gibt den Beendigungsstatus eines Threads zurück. Während ein Thread ausgeführt wird, lautet sein Beendigungsstatus STILL _ ACTIVE. Wenn ein Thread beendet wird, ändert sich sein Beendigungsstatus von STILL _ ACTIVE in den Exitcode des Threads.
Wenn ein Thread beendet wird, ändert sich der Zustand des Threadobjekts in signalisiert und gibt alle anderen Threads frei, die auf die Beendigung des Threads gewartet haben. Weitere Informationen zur Synchronisierungfinden Sie unter Synchronisieren der Ausführung mehrerer Threads.
Wenn ein Thread beendet wird, wird sein Threadobjekt erst freigegeben, wenn alle geöffneten Handles für den Thread geschlossen sind.
Beenden von Threads
Ein Thread wird ausgeführt, bis eines der folgenden Ereignisse eintritt:
- Der Thread ruft die ExitThread-Funktion auf.
- Jeder Thread des Prozesses ruft die ExitProcess-Funktion auf.
- Die Threadfunktion gibt zurück.
- Jeder Thread ruft die TerminateThread-Funktion mit einem Handle für den Thread auf.
- Jeder Thread ruft die TerminateProcess-Funktion mit einem Handle für den Prozess auf.
Der Exitcode für einen Thread ist entweder der Wert, der im Aufruf von ExitThread, ExitProcess, TerminateThreadoder TerminateProcessangegeben ist, oder der von der Threadfunktion zurückgegebene Wert.
Wenn ein Thread durch ExitThreadbeendet wird, ruft das System die Einstiegspunktfunktion jeder angefügten DLL mit einem Wert auf, der angibt, dass der Thread von der DLL getrennt wird (es sei denn, Sie rufen die DisableThreadLibraryCalls-Funktion auf). Wenn ein Thread durch ExitProcessbeendet wird, werden die DLL-Einstiegspunktfunktionen einmal aufgerufen, um anzugeben, dass der Prozess getrennt wird. DLLs werden nicht benachrichtigt, wenn ein Thread durch TerminateThread oder TerminateProcessbeendet wird. Weitere Informationen zu DLLs finden Sie unter Dynamic Link Libraries.
Die Funktionen TerminateThread und TerminateProcess sollten nur unter extremen Umständen verwendet werden, da sie keine Bereinigung von Threads zulassen, keine angefügten DLLs benachrichtigen und den anfänglichen Stapel nicht freigeben. Darüber hinaus werden Handles für Objekte, die sich im Besitz des Threads befinden, erst geschlossen, wenn der Prozess beendet wird. Die folgenden Schritte bieten eine bessere Lösung:
- Erstellen Sie ein Ereignisobjekt mithilfe der CreateEvent-Funktion.
- Erstellen Sie die Threads.
- Jeder Thread überwacht den Ereigniszustand durch Aufrufen der WaitForSingleObject-Funktion. Verwenden Sie ein Wartezeitintervall von 0 (null).
- Jeder Thread beendet seine eigene Ausführung, wenn das Ereignis auf den signalisierten Zustand festgelegt ist (WaitForSingleObject gibt WAIT _ OBJECT _ 0 zurück).