2011-01-12 18 views
20

Stavo facendo una programmazione multithread in Visual Studio C++ utilizzando le chiamate beginthreadex, endthreadex.I thread figlio terminano quando termina il thread padre

Creo un thread secondario thread1. Il thread figlio gira su una funzione che non esce mai in quanto ha un loop infinito. Ora se il thread padre termina con errori o termina con successo, esce anche il thread figlio? Il mio dubbio è - c'è qualche situazione in cui il thread figlio è vivo anche dopo che il programma principale è uscito?

Per Linux come dovrebbe essere questo caso?

+1

Ecco una domanda strettamente correlata: http://stackoverflow.com/questions/2197699/is-it-necessable-to-explicitly-stop-all-threads-prior-to-exiting-a-win32-applicati – sharptooth

+0

The il post ha risposte contrastanti. – excray

+0

@ user97642 Quali sono i conflitti dal tuo punto di vista? Le risposte mi sembrano tutte simili. –

risposta

31

Non esiste alcuna relazione padre/figlio tra i thread. Se il thread A crea il thread B e quindi il thread A termina, il thread B continuerà a essere eseguito.

L'eccezione è quando il thread principale (ovvero il thread che esegue la funzione main()) termina. Quando ciò accade, il processo termina e tutti gli altri thread si fermano.

+5

Due eccezioni. Se * any * thread chiama 'exit', quindi * all * threads terminano. – EML

+1

Vorrei anche aggiungere che se 'main' esiste senza chiamare' detach' sul thread in esecuzione, verrà generata un'eccezione. – Everyone

7

Poiché C e C++ mandate that returning from the main function kills all running threads, sì, il processo dovrebbe essere andato. E dal momento che tale comportamento viene eseguito dal runtime, la situazione dovrebbe essere la stessa su Linux.

+0

Il collegamento che hai fornito non dice nulla riguardo ai requisiti linguistici di * kill * (!) Tutti i thread. Cita solo un requisito per cui il ritorno da main equivale a chiamare exit(). –

2

Non appena il dado processo, tutte le risorse vengono rilasciate (memoria, i file e le discussioni)

il modo corretto di fare questo: quando si chiama BeginThread, mantenere l'handle restituito nel thread genitore, e chiama WaitForObject prima di lasciare il programma (noi unire il thread principale con il thread secondario).

Il thread principale bloccherà fino al termine del thread secondario. Se il tuo thread figlio ha un ciclo infinito, puoi definire un "punto di interruzione" e controllare se dovresti andartene. Ad esempio, utilizzando una variabile booleana condivisa. Controlla Interrupt Politely per maggiori informazioni.

+0

Il tuo caso va bene quando il programma normalmente termina, cioè raggiunge la fine di main(). Ma ci sono molti posti nel thread principale o principale che chiamano exit(). Quindi uscire() uccidere tutti i thread? – excray

+0

@ user97642 Se il thread principale termina, tutti gli altri thread si fermano –

+2

Ricorda che infiniti attese sui semafori, handle etc possono far diventare il tuo processo uno zombie sia in Windows che in Linux. Altrimenti è come dicono gli altri; quando il filo principale muore, tutti gli altri vengono uccisi. – JimR

Problemi correlati