Terminazione di un thread
La terminazione 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 passa a attivato, permettendo il rilascio di tutti gli altri thread che erano in attesa della sua terminazione. Per altre informazioni sulla sincronizzazione, vedere Sincronizzazione dell'esecuzione di più thread.
Quando un thread termina, il relativo oggetto thread non viene liberato finché 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.
- Qualunque 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, TerminateThreado TerminateProcesso 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 sta disconnettendo 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 si sta scollegando. Le DLL non ricevono notifiche quando un thread viene terminato da TerminateThread o TerminateProcess. Per ulteriori informazioni sulle DLL, vedere Dynamic-Link Librerie.
Le funzioni TerminateThread e TerminateProcess devono essere usate solo in circostanze estreme, poiché non consentono la pulizia dei thread, non inviare notifiche alle DLL associate e non liberare lo stack iniziale. Inoltre, gli handle per gli oggetti appartenenti al thread non vengono chiusi fino al termine del processo. I passaggi seguenti offrono una soluzione migliore:
- Creare un oggetto evento usando la funzione CreateEvent.
- Crea i thread.
- Ogni thread monitora lo stato dell'evento chiamando la funzioneWaitForSingleObject. 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).