Завершение потока

Завершение потока приводит к следующим результатам:

  • Освобождаются все ресурсы, принадлежащие потоку, такие как окна и перехватчики.
  • Задан код выхода потока.
  • Объект потока получает сигнал.
  • Если поток является единственным активным потоком в процессе, процесс завершается. Дополнительные сведения см. в разделе Завершение процесса.

Функция GetExitCodeThread возвращает состояние завершения потока. Во время выполнения потока его состояние завершения — STILL_ACTIVE. Когда поток завершается, его состояние завершения меняется с STILL_ACTIVE на код выхода потока.

Когда поток завершается, состояние объекта потока меняется на сигнальное, освобождая все другие потоки, ожидавшие завершения потока. Дополнительные сведения о синхронизации см. в статье Синхронизация выполнения нескольких потоков.

Когда поток завершается, его объект потока не освобождается, пока не будут закрыты все открытые дескрипторы потока.

Завершение потоков

Поток выполняется до тех пор, пока не произойдет одно из следующих событий:

  • Поток вызывает функцию ExitThread .
  • Любой поток процесса вызывает функцию ExitProcess .
  • Функция потока возвращает .
  • Любой поток вызывает функцию TerminateThread с дескриптором потока.
  • Любой поток вызывает функцию TerminateProcess с дескриптором процесса.

Код выхода для потока — это значение, указанное в вызове ExitThread, ExitProcess, TerminateThread или TerminateProcess, или значение, возвращаемое функцией потока.

Если поток завершается ExitThread, система вызывает функцию точки входа каждой присоединенной библиотеки DLL со значением, указывающим, что поток отсоединяется от библиотеки DLL (если не вызывается функция DisableThreadLibraryCalls ). Если поток завершается ExitProcess, функции точки входа DLL вызываются один раз, чтобы указать, что процесс отсоединяется. Библиотеки DLL не получают уведомления о завершении потока с помощью TerminateThread или TerminateProcess. Дополнительные сведения о библиотеках DLL см. в разделе Библиотеки Динамической компоновки.

Функции TerminateThread и TerminateProcess следует использовать только в крайних случаях, так как они не позволяют потокам очищаться, не уведомляют присоединенные библиотеки DLL и не освобождают исходный стек. Кроме того, дескрипторы объектов, принадлежащих потоку, не закрываются до завершения процесса. Следующие шаги предоставляют лучшее решение.

  • Создайте объект события с помощью функции CreateEvent .
  • Создайте потоки.
  • Каждый поток отслеживает состояние события путем вызова функции WaitForSingleObject . Используйте интервал ожидания времени ожидания, равный нулю.
  • Каждый поток завершает собственное выполнение, когда событие задается в состояние сигнала (WaitForSingleObject возвращает WAIT_OBJECT_0).