View Full Version : Terminare correttamente un thread
tomminno
22-06-2007, 13:24
Qual è il modo corretto per terminare dall'esterno un thread?
La struttura del thread è del tipo
while(!stop)
{
//Fai qualcosa
Sleep(30000);
}
Poichè il thread è sempre in stato di sleep e devo deallocare la classe che ha creato il thread capita (se non aspetto l'uscita per la condizione di stop) che questo possa risvegliarsi dopo che ho deletato la classe causando ovviamente casini.
Inoltre sempre in generale quando è il caso di eseguire la CloseHandle su un thread?
Qual è il modo corretto per terminare dall'esterno un thread?
La struttura del thread è del tipo
while(!stop)
{
//Fai qualcosa
Sleep(30000);
}
Si sta parlando di API Win32, è bene precisarlo. ;)
Comunque la cosa migliore è che il thread termini in modo "naturale", cioè che la funzione principale del thread termini o che venga eseguita prima una ExitThread().
L'ideale è appunto usare una variabile, nel tuo caso 'stop' da settare a TRUE per far terminare il ciclo.
Il problema principale è che per la Sleep hai messo un tempo bello lungo (30 sec.), quindi ammesso di essere appena entrato nella Sleep, se si setta stop a TRUE, c'è da attendere 30 secondi!
Una soluzione migliore è usare WaitForSingleObject. Crei un evento con CreateEvent e poi, nel tuo thread, usi WaitForSingleObject per fare il wait su quell'evento, specificando sempre i millisecondi di timeout che ti servono.
Se qualcuno dall'esterno fa diventare l'evento "signaled", la WaitForSingleObject ritorna immediatamente e te ne accorgi perché restituisce WAIT_OBJECT_0 invece di WAIT_TIMEOUT (in caso di timeout).
Inoltre sempre in generale quando è il caso di eseguire la CloseHandle su un thread?La documentazione dice: The thread object remains in the system until the thread has terminated and all handles to it have been closed through a call to CloseHandle.
Quindi quando il thread è terminato e non hai più bisogno di quel handle.
tomminno
22-06-2007, 15:46
Si sta parlando di API Win32, è bene precisarlo. ;)
Comunque la cosa migliore è che il thread termini in modo "naturale", cioè che la funzione principale del thread termini o che venga eseguita prima una ExitThread().
L'ideale è appunto usare una variabile, nel tuo caso 'stop' da settare a TRUE per far terminare il ciclo.
Infatti generalmente faccio così, finchè non mi è capitato di dover fare un thread che si deve risvegliare solo sporadicamente.
Il problema principale è che per la Sleep hai messo un tempo bello lungo (30 sec.), quindi ammesso di essere appena entrato nella Sleep, se si setta stop a TRUE, c'è da attendere 30 secondi!
Una soluzione migliore è usare WaitForSingleObject. Crei un evento con CreateEvent e poi, nel tuo thread, usi WaitForSingleObject per fare il wait su quell'evento, specificando sempre i millisecondi di timeout che ti servono.
Se qualcuno dall'esterno fa diventare l'evento "signaled", la WaitForSingleObject ritorna immediatamente e te ne accorgi perché restituisce WAIT_OBJECT_0 invece di WAIT_TIMEOUT (in caso di timeout).
Grazie proverò.
Conosci l'equivalente su Linux? Basta un semplice pthread_cancel?
La documentazione dice: The thread object remains in the system until the thread has terminated and all handles to it have been closed through a call to CloseHandle.
Quindi quando il thread è terminato e non hai più bisogno di quel handle.
Ma sarebbe lecito chiamare la CloseHandle prima dell'uscita dalla funzione di callback?
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.