2016-12-29 116 views
1

是否有庫提供線程局部變量註冊構造函數的機制?初始化線程局部變量

我想讓我的庫提供一個線程局部結構,它應該使用動態獲取的數據在線程創建時初始化。

如果結構只是全局的,但不是線程本地的,我會用gcc的__attribute__((__constructor__))標記一個函數對它進行初始化,但是這些構造函數在創建新線程時不會重新觸發。

回答

3

不,線程創建不會調用任何構造函數。這是一件好事;自動調用構造函數不會在可能的大型應用程序中縮放,其中大多數線程與您的庫代碼無關,並且永遠不會調用它。

相反,您需要使用線程本地對象的庫代碼在新線程的第一次庫調用中構造它,或者需要調用應用程序在將使用的線程中顯式調用初始化函數它。第一種選擇通常要好很多,性能影響甚至不應該可以測量;訪問庫中的線程本地存儲需要比可預測的分支更長的時間:

static _Thread_local int init_done; 
if (!init_done) ...