Ordine di distruzione del thread principale e l'uso di pthread_key_create
-
28-10-2019 - |
Domanda
Mi chiedevo l'uso di pthread_key_create
mentre passa in una funzione distruttore.
Volevo avere qualcosa di simile:
static ComplexObject foo;
void workoncomplex(void *) {
foo.dosomestuff();
}
static pthread_key_t pthreadkey;
void function_called_by_threads() {
pthread_key_create(&pthreadkey, workoncomplex)
}
Ovviamente ho lasciato fuori una buona dose di dettagli.
Per qualsiasi thread che non è il thread principale, questo è ovviamente bene (bloccante fornito ecc.) E ogni volta che muore un thread, il mio workoncomplex
la funzione viene chiamata e manipola il foo
oggetto.
La mia domanda è: è valida per il thread principale, come ovviamente il pthreadkey
La chiamata del distruttore avviene al thread wind, ma è garantito di funzionare prima che le statiche vengano distrutte? In tal caso, dovrei controllare se sono nel thread principale e tornavo immediatamente? Oppure posso solo trattare tutti i thread allo stesso modo e presumere che i miei oggetti statici saranno ancora in giro.
Soluzione
La funzione Destructor non è chiamata all'uscita dell'applicazione. Viene chiamato solo quando esce un thread.
Se esci dal thread principale con pthread_exit()
Quindi verrà chiamata la funzione distruttore, ma l'applicazione non è ancora chiusa, quindi è sicura utilizzare il static
variabili.
Se chiami exit()
o tornare da main()
allora la funzione distruttore non verrà chiamata, quindi il fatto che il static
Le variabili vengono distrutte non è un problema. Uso atexit()
Per assicurarti che la funzione del tuo distruttore sia chiamato al ritorno da main()
o su una chiamata di exit()
.