Gemäß pthread_key_create Man-Seite können wir einen Destruktor zuordnen, der beim Herunterfahren des Threads aufgerufen werden soll. Mein Problem ist, dass die Destruktor-Funktion, die ich registriert habe, nicht aufgerufen wird. Giste meines Codes ist wie folgt.pthread_key_create destructor wird nicht aufgerufen
static pthread_key_t key;
static pthread_once_t tls_init_flag = PTHREAD_ONCE_INIT;
void destructor(void *t) {
// thread local data structure clean up code here, which is not getting called
}
void create_key() {
pthread_key_create(&key, destructor);
}
// This will be called from every thread
void set_thread_specific() {
ts = new ts_stack; // Thread local data structure
pthread_once(&tls_init_flag, create_key);
pthread_setspecific(key, ts);
}
Haben Sie eine Idee, was diesen Destruktor verhindern könnte? Ich benutze auch atexit() im Moment, um etwas im Hauptthread zu bereinigen. Gibt es eine Chance, dass die Destruktorfunktion gestört wird? Ich habe versucht, das auch zu entfernen. Trotzdem hat es nicht funktioniert. Auch mir ist nicht klar, ob ich den Hauptthread als separaten Fall mit atexit behandeln soll. (Es ist ein Muss, um die Art und Weise zu verwenden atexit, da ich an das Beenden der Anwendung einige anwendungsspezifische Bereinigung tun müssen,)
Eine kurze Problemumgehung hinzugefügt, die ich derzeit nicht mit großen Nachteilen denken kann: ':: atexit ([] {:: pthread_exit (0);});' – sehe
Beachten Sie, dass POSIX-Status * Die Funktionen von einem Anruf registriert to atexit() muss zurückkehren, um sicherzustellen, dass alle registrierten Funktionen * aufgerufen werden. Wenn Sie also 'pthread_exit()' in einer atexit-registrierten Funktion verwenden, können alle verbleibenden Funktionen auf dem atexit-Stack nicht aufgerufen werden. –
@AlexanderKlauer sehr guter Punkt. Ich muss diesen Gedanken noch einmal untersuchen, wenn ich den Code erneut berühre – sehe