Функция TerminateThread

Вызов этой функции также завершает поток:

BOOL TerminateThread( HANDLE hThread, DWORD dwExitCode);

В параметр dwExitCode помещается код завершения потока. После того как поток будет уничтожен, счетчик пользователей его объекта ядра "поток” уменьшится.

Если завершается процесс:

Функции ExitProcess и TerminateProcess принудительно завершают потоки, принадлежащие завершаемому процессу.

Эти функции прекращают выполнение всех потоков, принадлежавших завершенному процессу. При этом гарантируется высвобождение любых выделенных процессу ресурсов, в том числе стеков потоков. Однако эти две функции уничтожают потоки принудительно так, будто для каждого из них вызывается функция TerminateThread. А это означает, что очистка проводится некорректно, деструкторы С++-объектов не вызываются, данные на диск не сбрасываются и т. д.

Действия при завершении потока

· Освобождаются все описатели User-объектов, принадлежавших потоку.

· Код завершения потока меняется со STILL_ACTIVE на код, переданный в функцию ExitThread или TerminateThread.

· Объект ядра "поток" переводится в свободное состояние.

· Если данный поток является последним активным потоком в процессе, завершается и сам процесс.

· Счетчик пользователей объекта ядра "поток" уменьшается на 1.

· BOOL GetExitCodeThread( HANDLE hThread, PDWORD pdwExitCode);

 

Управление динамическими приоритетами потока:

BOOL SetThreadPriorityBoost(

HANDLE hThread, // дескриптор потока

BOOL DisablePriorityBoost // состояние форсирования приоритета

);

BOOL GetThreadPriorityBoost(

HANDLE hThread, // дескриптор потока

PBOOL pDisablePriorityBoost // состояние форсажа //приоритета

);

 

Поток должен иметь право доступа THREAD_SET_INFORMATION.

 

Управление потоками:

Флаг CREATE_SUSPENDED

Если поток создан с флагом CREATE_SUSPENDED, то после своего создания он остается в приостановленном состоянии. Вы можете настроить некоторые его свойства (например, приоритет, о котором мы поговорим позже). Закончив настройку, Вы должны разрешить выполнение потока. Для этого вызовите ResumeThread и пере дайте описатель потока, возвращенный функцией CreateThread.

DWORD ResumeThread(HANDLE hThread);

Выполнение потока можно приостановить не только при его создании с флагом CREATE_SUSPENDED, но и вызовом SuspendThread. Выполнение отдельного потока можно приостанавливать несколько раз. Если поток приостановлен 3 раза, то и возобновлен он должен быть тоже 3 раза — лишь тогда система выделит ему процессорное время.

DWORD SuspendThread(HANDLE hThread);