原文出處: 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說明即可。列如:
凡是帶有__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變量的初始化只能用編譯期常量,例如:
除了以上之外,關(guān)于線程局部存儲變量的聲明和使用還需注意一下幾點:
__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ā)工程師看過來 ->《高薪招募講師》
|
|