È corretto chiamare pthread_exit dal main?

Quando chiamo pthread_exit da main , il programma non finisce mai. Mi aspettavo che il programma finisse, visto che stavo uscendo dall’unica thread del programma, ma non funzionava. Sembra appeso.

 #include  #include  #include  int main(int argc, char *argv[]) { printf("-one-\n"); pthread_exit(NULL); printf("-two-\n"); } 

Process Explorer mostra che il thread (solo) è in stato Wait:DelayExecution .

Secondo la documentazione di pthread_exit :

Il processo deve uscire con uno stato di uscita di 0 dopo che l’ultimo thread è stato terminato. Il comportamento sarà come se l’implementazione avesse chiamato exit () con un argomento zero al momento della terminazione del thread.

Sto usando Dev-C ++ v4.9.9.2 e pthreads-win32 v2.8.0.0 (collegamento a libpthreadGC2.a ).

La libreria sembra essere OK (ad esempio, chiamare pthread_self o pthread_create da main funziona bene).

C’è qualche ragione per ciò che non dovrei chiamare pthread_exit dal main ?

Bene è sicuramente legale nell’implementazione Linux di pthreads, vedere la sezione note in pthreads_exit . Dichiara

Per consentire ad altri thread di continuare l’esecuzione, il thread principale dovrebbe terminare chiamando pthread_exit () piuttosto che exit (3).

Inoltre, uno sguardo al codice sorgente qui (torwads alla fine) mostra che si traduce approssimativamente in _endthread o _endthreadex. La documentazione qui per quelli non fa menzione di non chiamarlo nella discussione iniziale.

Questo comportamento completamente legale e previsto. L’intero processo termina solo quando tutti i thread terminano o exit è chiamato esplicitamente o implicitamente.

Un normale ritorno da main equivale a una chiamata per exit . Se termina main con pthread_exit stai dicendo esplicitamente che vuoi che gli altri thread continuino.

Durante i test su Linux (versione CentOS Linux 7.2.1511 (Core)) ho scoperto che in effetti il ​​programma principale attende che i thread “figlio” continuino. Inoltre non sono stato in grado di passare un codice di ritorno da main, sebbene possa essere specificato come argomento per pthread_exit (), poiché Raul ha detto sopra che ritorna sempre con il codice di uscita 0:

 retval=3; pthread_exit(&retval); 

Abbiamo anche osservato un messaggio di errore quando si utilizzava Clang compiler (versione 3.4.2) e opzioni sanitizer:

 ==5811==ERROR: AddressSanitizer: attempting free on address which was not malloc()-ed: 0x7f4c090321d0 in thread T0 #0 0x7f4c08be3e29 in __interceptor_free (/home/karstenburger/tests/libc/pthread_exit_in_main/a+0x65e29) #1 0x7f4c08333358 in free_key_mem (/lib64/libdl.so.2+0x1358) #2 0x7f4c08745bc1 in __nptl_deallocate_tsd (/lib64/libpthread.so.0+0x7bc1) #3 0x7f4c07771b38 in __libc_start_main (/lib64/libc.so.6+0x21b38) #4 0x7f4c08bfa08c in _start (/home/karstenburger/tests/libc/pthread_exit_in_main/a+0x7c08c) AddressSanitizer can not describe address in more detail (wild memory access suspected). SUMMARY: AddressSanitizer: bad-free ??:0 __interceptor_free ==5811==ABORTING