在linux中還有一種更為高效的執行緒區域性儲存方法,就是使用關鍵字__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; // 正確,但是需要手工初始化並銷毀物件
除了以上之外,關於執行緒區域性儲存變數的宣告和使用還需注意一下幾點:
如果變數宣告中使用量關鍵字static或者extern,那麼關鍵字__thread必須緊隨其後。
與一般的全域性變數或靜態變數一樣,執行緒區域性變數在宣告時可以設定乙個初始化值。
可以使用c語言取位址符(&)來獲取執行緒區域性變數的位址。
參考
[1]
[2] linux/unix系統程式設計手冊(上)
[3] linux多執行緒服務端程式設計使用muduo c++網路庫
Linux 中的執行緒區域性儲存(2)
linux 中的執行緒區域性儲存 1 提到了一種,其實在linux中還有一種更為高效的執行緒區域性儲存方法,就是使用關鍵字 thread來定義變數。thread是gcc內建的執行緒區域性儲存設施 thread local storage 它的實現非常高效,與pthread key t向比較更為快速,...
執行緒的區域性儲存
在前面提到多執行緒或者多程序程式設計中,都會提到乙個資源共享的問題。現在可以知道通過使用各種鎖來控制資料的共同訪問資源的問題。但在實際情況中還會有一種場景,就是每個執行緒都有自己的相同的類似的資源,這樣每個執行緒都可以控制自己的資源。就如好多孩子一起撿豆子,每人有乙個盛豆子的容器一樣,每個孩子把自己...
執行緒區域性儲存 TLS
本來想通過tid為索引建個表來實現該功能,沒想到已經有現成的機制。單個執行緒的特有資料,介於全域性變數和區域性變數之間。linux 方法一 int pthread key create pthread key t key,void destructor void int pthread key de...