Encerrando um thread
O encerramento de um thread tem os seguintes resultados:
- Todos os recursos pertencentes ao thread, como janelas e ganchos, são liberados.
- O código de saída do thread está definido.
- O objeto thread é sinalizado.
- Se o thread for o único thread ativo no processo, o processo será encerrado. Para obter mais informações, consulte Encerrando um processo.
A função GetExitCodeThread retorna a status de encerramento de um thread. Enquanto um thread está sendo executado, sua status de terminação é STILL_ACTIVE. Quando um thread é encerrado, sua terminação status muda de STILL_ACTIVE para o código de saída do thread.
Quando um thread é encerrado, o estado do objeto thread muda para sinalizado, liberando quaisquer outros threads que estavam aguardando o término do thread. Para obter mais informações sobre sincronização, consulte Sincronizando a execução de vários threads.
Quando um thread é encerrado, seu objeto thread não é liberado até que todas as alças abertas para o thread sejam fechadas.
Como os threads são encerrados
Um thread é executado até que um dos seguintes eventos ocorra:
- O thread chama a função ExitThread .
- Qualquer thread do processo chama a função ExitProcess .
- A função thread retorna.
- Qualquer thread chama a função TerminateThread com um identificador para o thread.
- Qualquer thread chama a função TerminateProcess com um identificador para o processo.
O código de saída de um thread é o valor especificado na chamada para ExitThread, ExitProcess, TerminateThread ou TerminateProcess ou o valor retornado pela função thread.
Se um thread for encerrado pelo ExitThread, o sistema chamará a função de ponto de entrada de cada DLL anexada com um valor que indica que o thread está desanexando da DLL (a menos que você chame a função DisableThreadLibraryCalls ). Se um thread for encerrado pelo ExitProcess, as funções de ponto de entrada da DLL serão invocadas uma vez para indicar que o processo está desanexando. As DLLs não são notificadas quando um thread é encerrado por TerminateThread ou TerminateProcess. Para obter mais informações sobre DLLs, consulte Bibliotecas de link dinâmico.
As funções TerminateThread e TerminateProcess devem ser usadas apenas em circunstâncias extremas, pois não permitem que os threads limpo, não notifiquem as DLLs anexadas e não liberem a pilha inicial. Além disso, os identificadores para objetos pertencentes ao thread não são fechados até que o processo seja encerrado. As seguintes etapas fornecem uma solução melhor:
- Crie um objeto de evento usando a função CreateEvent .
- Crie os threads.
- Cada thread monitora o estado do evento chamando a função WaitForSingleObject . Use um intervalo de tempo limite de espera de zero.
- Cada thread encerra sua própria execução quando o evento é definido como o estado sinalizado (WaitForSingleObject retorna WAIT_OBJECT_0).