Condividi tramite


Terminazione di un thread

Il termine di un thread ha i risultati seguenti:

  • Tutte le risorse di proprietà del thread, ad esempio finestre e hook, vengono liberate.
  • Il codice di uscita del thread è impostato.
  • L'oggetto thread viene segnalato.
  • Se il thread è l'unico thread attivo nel processo, il processo viene terminato. Per altre informazioni, vedere Terminazione di un processo.

La funzione GetExitCodeThread restituisce lo stato di terminazione di un thread. Durante l'esecuzione di un thread, lo stato di terminazione è STILL_ACTIVE. Quando un thread termina, lo stato di terminazione cambia da STILL_ACTIVE al codice di uscita del thread.

Quando un thread termina, lo stato dell'oggetto thread viene modificato in segnalato, rilasciando tutti gli altri thread in attesa che il thread venga terminato. Per altre informazioni sulla sincronizzazione, vedere Sincronizzazione dell'esecuzione di più thread.

Quando un thread termina, il relativo oggetto thread non viene liberato fino a quando non vengono chiusi tutti gli handle aperti al thread.

Modalità di terminazione dei thread

Un thread viene eseguito fino a quando non si verifica uno degli eventi seguenti:

  • Il thread chiama la funzione ExitThread .
  • Qualsiasi thread del processo chiama la funzione ExitProcess .
  • La funzione thread restituisce.
  • Qualsiasi thread chiama la funzione TerminateThread con un handle per il thread.
  • Qualsiasi thread chiama la funzione TerminateProcess con un handle per il processo.

Il codice di uscita per un thread è il valore specificato nella chiamata a ExitThread, ExitProcess, TerminateThread o TerminateProcess oppure il valore restituito dalla funzione thread.

Se un thread viene terminato da ExitThread, il sistema chiama la funzione del punto di ingresso di ogni DLL collegata con un valore che indica che il thread si sta scollegando dalla DLL (a meno che non si chiami la funzione DisableThreadLibraryCalls ). Se un thread viene terminato da ExitProcess, le funzioni del punto di ingresso dll vengono richiamate una sola volta, per indicare che il processo viene scollegato. Le DLL non vengono notificate quando un thread viene terminato da TerminateThread o TerminateProcess. Per altre informazioni sulle DLL, vedere Librerie a collegamento dinamico.

Le funzioni TerminateThread e TerminateProcess devono essere usate solo in circostanze estreme, poiché non consentono la pulizia dei thread, non notificano le DLL associate e non liberano lo stack iniziale. Inoltre, gli handle agli oggetti di proprietà del thread non vengono chiusi fino al termine del processo. I passaggi seguenti offrono una soluzione migliore:

  • Creare un oggetto evento usando la funzione CreateEvent .
  • Creare i thread.
  • Ogni thread monitora lo stato dell'evento chiamando la funzione WaitForSingleObject . Usare un intervallo di timeout di attesa pari a zero.
  • Ogni thread termina la propria esecuzione quando l'evento viene impostato sullo stato segnalato (WaitForSingleObject restituisce WAIT_OBJECT_0).