每天進步一點點 Linux中的執行緒區域性儲存(二)

2021-09-08 17:57:01 字數 1134 閱讀 1338

在linux中另一種更為高效的執行緒區域性儲存方法,就是使用keyword__thread來定義變數。__thread是gcc內建的執行緒區域性儲存設施(thread-local storage),它的實現很高效。與pthread_key_t向比較更為高速。其儲存效能能夠與全域性變數相媲美,並且使用方式也更為簡單。建立執行緒區域性變數僅僅需簡單的在全域性或者靜態變數的宣告中增加__thread說明就可以。

列如:

static __thread char t_buf[32] = ;

extern __thread int t_val = 0;

凡是帶有__thread的變數,每乙個執行緒都擁有該變數的乙份拷貝。且互不干擾。執行緒區域性儲存中的變數將一直存在,直至執行緒終止。當執行緒終止時會自己主動釋放這一儲存。__thread並非全部資料型別都能夠使用的。由於其僅僅支援pod(plain old data structure)[1]型別。不支援class型別——其不能自己主動呼叫建構函式和析構函式。

同一時候__thread能夠用於修飾全域性變數、函式內的靜態變數,可是不能用於修飾函式的區域性變數或者class的普通成員變數。另外。__thread變數的初始化僅僅能用編譯期常量。比如:

__thread std::string t_object_1 ("swift");                   // 錯誤。由於不能呼叫物件的建構函式

__thread std::string* t_object_2 = new std::string (); // 錯誤,初始化必須用編譯期常量

__thread std::string* t_object_3 = nullptr;                // 正確,可是須要手工初始化並銷毀物件

除了以上之外。關於執行緒區域性儲存變數的宣告和使用還需注意一下幾點:

假設變數宣告中使用量keywordstatic或者extern。那麼keyword__thread必須緊隨其後。

與一般的全域性變數或靜態變數一樣。執行緒區域性變數在宣告時能夠設定乙個初始化值。

能夠使用c語言取位址符(&)來獲取執行緒區域性變數的位址。

參考

[1]

[2] linux/unix系統程式設計手冊(上)

[3] linux多執行緒服務端程式設計使用muduo c++網路庫

每天進步一點點

很多朋友總喜歡問 成功靠什麼?其實,成功很難單一的歸納為靠什麼條件,如果一定要回答,只能從某種意義上說 很多人的成功就是靠他們每天比別人 多做一點點 正如古人有云 業精於勤,荒於嬉。這裡所說的勤,也就是比別人多做一點點,即付出多一點的勞動和努力。不要小看這一點點,又如古語說 集腋成裘,積沙成丘。如果...

每天進步一點點

在模組化程式設計時,在子模組中宣告變數 例如unsigned char aa 不需要在標頭檔案中宣告 要在主函式中呼叫,要寫成 extern unsigned char aa 而不能寫成 extern aa 寫成extern aa 則無法改變aa的值。2014年9月22日 21 12 00 品質因數...

每天進步一點點(一)

最近接了第乙個商業專案,一人獨立完成從前台到後台,做了有幾天的時間,每天進步一點點,把每天看到的學到的記錄下來,以後也堅持。後台繼續用自己的extjs老本行,因為相比其他js庫,extjs用的比較熟,現成的 也有所以開發起來也比較容易,今天學到了兩個ext的新東西。一 ext和後台進行互動大部分用的...