Partilhar via


Encerrando um thread

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