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

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top