Compartilhar via


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).