(1) Nel codice C++, usando return
fa sì che lo stack venga svolto e le variabili locali distrutte, mentre pthread_exit
è garantito solo per richiamare i gestori di cancellazione registrati con pthread_cancel_push()
. Su alcuni sistemi questo meccanismo causerà anche la chiamata dei distruttori per le variabili locali C++, ma questo non è garantito per il codice portabile --- controlla la documentazione della tua piattaforma.
Inoltre, in main()
, return
chiamerà implicitamente exit()
, e quindi terminare il programma, mentre pthread_exit()
terminerà semplicemente il thread e il programma rimarrà in esecuzione fino a quando tutti i thread non saranno terminati o alcuni thread non richiameranno exit()
, abort()
o un'altra funzione che termina il programma.
(2) L'uso di return
funziona perché lo dice la specifica POSIX. Il valore restituito viene memorizzato in una posizione in cui pthread_join()
può recuperarlo. Le risorse utilizzate dal thread non vengono recuperate fino a pthread_join()
si chiama.
(3) Non uso mai il valore di ritorno di un thread nei thread POSIX grezzi. Tuttavia, tendo a utilizzare funzionalità di livello superiore come la libreria di thread Boost e, più recentemente, la libreria di thread C++0x, che forniscono mezzi alternativi per il trasferimento di valori tra thread come futures, che evitano i problemi associati alla gestione della memoria che si alludere a.
Penso che return
dal start_routine
è preferibile, perché garantisce che lo stack di chiamate venga svolto correttamente.
Questo è ancora più importante per C rispetto a C++ poiché non ha la magia del distruttore che ripulisce il caos dopo le uscite preliminari. Quindi il tuo codice dovrebbe passare attraverso tutte le parti finali delle routine sullo stack di chiamate per eseguire free
s e simili.
Perché funziona, è semplice
Se la start_routine ritorna, l'effetto sarà come se ci fosse una chiamata implicita a pthread_exit() utilizzando il valore di ritorno di start_routine come stato di uscita
Per la mia esperienza personale tendo a non usare molto lo stato dei thread terminati. Questo è il motivo per cui spesso ho avviato i thread detached
. Ma questo dovrebbe dipendere molto dall'applicazione e non è certo generalizzabile.