Beenden eines Threads

Das Beenden eines Threads hat die folgenden Ergebnisse:

  • Alle Ressourcen, die dem Thread gehören, z. B. Fenster und Hooks, werden freigegeben.
  • Der Threadausgangscode 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 die Beendigung status eines Threads zurück. Während der Ausführung eines Threads wird dessen status STILL_ACTIVE. Wenn ein Thread beendet wird, ändert sich seine Beendigung status von STILL_ACTIVE zum Exitcode des Threads.

Wenn ein Thread beendet wird, ändert sich der Status des Threadobjekts in signalisiert, sodass alle anderen Threads freigegeben werden, die auf das Beenden des Threads gewartet haben. Weitere Informationen zur Synchronisierung finden 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 bis zu einem der folgenden Ereignisse ausgeführt:

Der Exitcode für einen Thread ist entweder der im Aufruf von ExitThread, ExitProcess, TerminateThread oder TerminateProcess angegebene Wert oder der von der Threadfunktion zurückgegebene Wert.

Wenn ein Thread von ExitThread beendet 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 von ExitProcess beendet wird, werden die DLL-Einstiegspunktfunktionen einmal aufgerufen, um anzugeben, dass der Prozess getrennt wird. DLLs werden nicht benachrichtigt, wenn ein Thread durch TerminateThread oder TerminateProcess beendet 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 Sauber von Threads zulassen, angefügte DLLs nicht 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 mithilfe der CreateEvent-Funktion ein Ereignisobjekt.
  • Erstellen Sie die Threads.
  • Jeder Thread überwacht den Ereigniszustand, indem die WaitForSingleObject-Funktion aufgerufen wird . Verwenden Sie ein Wartezeittimeoutintervall von 0 (null).
  • Jeder Thread beendet seine eigene Ausführung, wenn das Ereignis auf den signalierten Zustand festgelegt ist (WaitForSingleObject gibt WAIT_OBJECT_0 zurück).