GNU/Linux >> Linux Esercitazione >  >> Linux

return() rispetto a pthread_exit() nelle funzioni di avvio di pthread

(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.


Linux
  1. Avviare un processo su un Tty diverso?

  2. Backup a livello di byte e backup a livello di file?

  3. Funzioni nelle variabili Shell?

  4. Abilita i servizi in Linux

  5. Come nominare un thread in Linux?

Funzioni Bash

Inizia con GNUPlot

Kernel Linux e le sue funzioni

errno è thread-safe?

Come stampare pthread_t

Script di avvio postgresql di systemd