Завершение задачи
Задача может завершиться как по собственной инициативе, так и по инициативе другой задачи. В первом случае задача либо выполняет оператор возврата из функции задачи, либо пользуется специальными функциями.
Для того чтобы завершить свое выполнение, задача, запущенная с помощью фукнции CreateThread, может вызвать функцию ExitThread, передав ей код завершения:
VOID ExitThread(DWORD dwExitCode);
Для принудительного завершения дочерней задачи родительская задача может использовать функцию TerminateThread, передав ей идентификатор завершаемой задачи и код завершения:
BOOL TerminateThread(
HANDLE hThread, // идентификатор завершаемой задачи
DWORD dwExitCode); // код завершения
Как родительская задача может получить код завершения дочерней задачи?
Для этого она должна вызвать фукнцию GetExitCodeThread:
BOOL GetExitCodeThread(
HANDLE hThread, // идентификатор завершаемой задачи
LPDWORD lpExitCode); // адрес для приема кода завершения
Если задача, для которой вызвана фукнция GetExitCodeThread, все еще работает, вместо кода завершения возвращается значение STILL_ACTIVE.
Как мы уже говорили, если задача была запущена с помощью функций _beginthread или _beginthreadex, она может завершать свое выполнение только с помощью функций, соответственно, _endthread и _endthreadex. Функцию ExitThread в этом случае использовать нельзя, так как при этом не будут освобождены ресурсы, заказанные для работы с мультизадачным вариантом библиотеки времени выполнения.