根據pthread_key_create手冊頁,我們可以關聯一個析構函數以在線程關閉時調用。我的問題是我註冊的析構函數沒有被調用。我的代碼的要點如下。pthread_key_create析構函數沒有被調用
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);
}
任何想法什麼可能會阻止這個析構函數被調用?我也在使用atexit()在主線程中進行一些清理。有沒有機會干擾被調用的析構函數?我也嘗試刪除它。儘管如此,仍然沒有工作。另外我不清楚我是否應該將主線程作爲與atexit分開的情況處理。 (這是由的方式來使用的atexit必須的,因爲我需要做的,在應用程序退出一些專用清理)
添加了一個簡潔的解決方法,我目前無法想到主要缺點:':: atexit([] {:: pthread_exit(0);});' – sehe
請注意POSIX狀態*通過調用註冊的函數to atexit()必須返回以確保所有註冊的函數都被調用*。因此,如果您在atexit註冊函數中使用'pthread_exit()',則可能不會調用atexit堆棧上的其餘任何函數。 –
@亞歷山大·克勞爾很好的一點。當我再次觸摸代碼時,我將不得不重新審視這個想法 – sehe