小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

Linux中的線程局部存儲(2)

 nisz 2016-06-25
原文出處: cywosp   

Linux 中的線程局部存儲(1)》提到了一種,其實在Linux中還有一種更為高效的線程局部存儲方法,就是使用關(guān)鍵字__thread來定義變量。

__thread是GCC內(nèi)置的線程局部存儲設(shè)施(Thread-Local Storage),它的實現(xiàn)非常高效,與pthread_key_t向比較更為快速,其存儲性能可以與全局變量相媲美,而且使用方式也更為簡單。創(chuàng)建線程局部變量只需簡單的在全局或者靜態(tài)變量的聲明中加入__thread說明即可。列如:

1
2
static __thread char t_buf[32] = {'\0'};
extern __thread int t_val = 0;

凡是帶有__thread的變量,每個線程都擁有該變量的一份拷貝,且互不干擾。線程局部存儲中的變量將一直存在,直至線程終止,當(dāng)線程終止時會自動釋放這一存儲。__thread并不是所有數(shù)據(jù)類型都可以使用的,因為其只支持POD(Plain old data structure)[1]類型,不支持class類型——其不能自動調(diào)用構(gòu)造函數(shù)和析構(gòu)函數(shù)。同時__thread可以用于修飾全局變量、函數(shù)內(nèi)的靜態(tài)變量,但是不能用于修飾函數(shù)的局部變量或者class的普通成員變量。另外,__thread變量的初始化只能用編譯期常量,例如:

1
2
3
__thread std::string t_object_1 ('Swift');                   // 錯誤,因為不能調(diào)用對象的構(gòu)造函數(shù)
__thread std::string* t_object_2 = new std::string (); // 錯誤,初始化必須用編譯期常量
__thread std::string* t_object_3 = nullptr;                // 正確,但是需要手工初始化并銷毀對象

除了以上之外,關(guān)于線程局部存儲變量的聲明和使用還需注意一下幾點:

  1. 如果變量聲明中使用量關(guān)鍵字static或者extern,那么關(guān)鍵字__thread必須緊隨其后。
  2. 與一般的全局變量或靜態(tài)變量一樣,線程局部變量在聲明時可以設(shè)置一個初始化值。
  3. 可以使用C語言取地址符(&)來獲取線程局部變量的地址。

__thread的使用例子可參考 https://github.com/ApusApp/Swift/blob/master/swift/base/logging.cpp 的實現(xiàn)及其單元測試對于那些非POD數(shù)據(jù)類型,如果想使用線程局部存儲機制,可以使用對pthread_key_t封裝的類來處理,具體方式可參考https://github.com/ApusApp/Swift/blob/master/swift/base/threadlocal.h 的實現(xiàn)以及其的單元測試

拿高薪,還能擴大業(yè)界知名度!優(yōu)秀的開發(fā)工程師看過來 ->《高薪招募講師
1 贊 1 收藏 評論

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多