Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Encerrar 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 a sequência for a única sequência ativa no processo, o processo é encerrado. Para obter mais informações, consulte Encerrando um processo.
A função GetExitCodeThread retorna o status de término de uma thread. Enquanto um thread está em execução, seu status de término é STILL_ATIVE. Quando um thread termina, seu status de terminação muda de STILL_ATIVE para o código de saída do thread.
Quando um thread termina, 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 termina, 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 o ExitThread função.
- 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 para um thread é o valor especificado na chamada para ExitThread, ExitProcess, TerminateThreadou TerminateProcess, ou o valor retornado pela função thread.
Se um thread for encerrado por ExitThread, o sistema chamará a função de ponto de entrada de cada DLL anexada com um valor indicando que o thread está se desanexando da DLL (a menos que você chame a funçãoDisableThreadLibraryCalls). Se um thread for encerrado por ExitProcess , as funções de ponto de entrada DLL serão invocadas uma vez, para indicar que o processo está sendo desanexado. As DLLs não são notificadas quando uma thread é encerrada por TerminateThread ou TerminateProcess . Para obter mais informações sobre DLLs, consulte Dynamic-Link Libraries.
As funções TerminateThread e TerminateProcess devem ser usadas apenas em circunstâncias extremas, pois não permitem que threads sejam limpos, não notificam DLLs anexadas e não liberam a pilha inicial. Além disso, as alças para objetos pertencentes ao thread não são fechadas até que o processo seja encerrado. As etapas a seguir 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 igual a zero.
- Cada thread encerra sua própria execução quando o evento é definido para o estado sinalizado (WaitForSingleObject retorna WAIT_OBJECT_0).