tls是什麼呢?thread local storage(執行緒本地儲存),tls 是乙個機制,經過它,程式可以擁有全域性變數,但處於「每一線程各不相同」的狀態。也就是說,程序中的所有執行緒都可以擁有全域性變數,但這些變數其實是特定對某個執行緒才有意義,各個執行緒擁有全域性變數的乙個副本,各自之間不相影響。
使用tls,你需要如下4個api: tlsalloc、tlsgetvalue、tlssetvalue 和 tlsfree。
使用了tls後,當有新的執行緒物件誕生,系統就會給該執行緒分配乙個區塊,tls中每乙個執行緒的限制是64的dword。也就是你在各個執行緒之間最多「共享」64個全域性dword的值,不過,這也是絕對夠用了。
一旦執行緒結束,程式**就釋放所有配置來的區塊。我們可以從結構tdb中看到,每乙個thread database 都有64 個dwords 給tls 使用。當你以tls 函式設定或取出資料,事實上你真正面對的就是那64 dwords。kernel32 使用兩個dwords(總共64 個位)佇列來記錄哪乙個dword 是可用的、哪乙個dword已經被用。這兩個dwords 可想象成為兩個dword陣列,合起來供64 位。
(1)tlsalloc
上面我們說過了kernel32 使用兩個dwords(總共64 個位)來記錄哪乙個dword是可用的、哪乙個dword 已經被用。當你需要使用乙個tls slot 的時候,你就可以用這個函式將相應的tls slot位置1。
(2)tlssetvalue
tlssetvalue 可以把資料放入先前配置到的tls slot 中。兩個引數分別是tls slot 索引值以及欲寫入的資料內容。tlssetvalue 就把你指定的資料放入64 dwords 所組成的陣列(位於目前的thread database)的適當位置中。
(3)tlsgetvalue
這個函式幾乎是tlssetvalue 的一面鏡子,最大的差異是它取出資料而非設定資料。和tlssetvalue 一樣,這個函式也是先檢查tls 索引值合法與否。如果是,tlsgetvalue 就使用這個索引值找到64 dwords 陣列(位於thread database 中)的對應資料項,並將其內容傳回。
(4)tlsfree
這個函式將tlsalloc 和tlssetvalue 的努力全部抹消掉。tlsfree 先檢驗你交給它的索引值是否的確被配置過。如果是,它將對應的64 位tls slots 位關閉。然後,為了避免那個已經不再合法的內容被使用,tlsfree 巡訪程序中的每乙個執行緒,把0 放到剛剛被釋放的那個tls slot 上頭。於是呢,如果有某個tls 索引後來又被重新配置,所有用到該索引的執行緒就保證會取回乙個0 值,除非它們再呼叫tlssetvalue。
如下是msdn上的乙個例子《using thread local storage
》。[cpp]view plain
copy
#include
#include
#define threadcount 4
dword dwtlsindex;
void errorexit(
lpstr);
void commonfunc(
void)
dword winapi threadfunc(
void)
int main(
void)
for (i = 0; i
waitforsingleobject(hthread[i], infinite);
tlsfree(dwtlsindex);
return 0;
}
void errorexit (
lpstr lpszmessage)
既然每個執行緒都有自己的私有堆疊,那麼還要整個tls做什麼?執行緒的私用資料全放堆疊裡不就得了?有人會這樣疑問?
我們來看一段偽**:
[cpp]view plain
copy
int a=100;
createthread(threadproc,null);
void threadproc(
void* lpvoid)
void a()
void b()
void c()
如下這張圖生動的展示了tls執行機制:
該程序中有2個執行緒,thread1和thread2。它分配了2個index給tls使用,gdwtlsindex1 和gdwtlsindex2,每個執行緒分配了2個記憶體塊分別儲存資料,並且在tls slots中儲存了指標。要通過index獲得關聯的資料,執行緒需要從tls slot中通過指標指向的記憶體塊實現,並存在 lpvdata 這個本地變數中
iOS探索 網路相關
超文字傳輸協議 我們來看一下請求報文的格式,首先是請求行,請求行包括方法 url 協議文字,方法常見的有get post,url就是我們的請求位址,協議文字一般是http1.1版本 然後再看一下請求頭,頭部欄位都是以key value的形式組合在一起的,由多個首部欄位名構成首部字段區域 之後是我們的...
相關性探索
相關不等於因果 在日常生活中常聽到 某某兩事關係不大 的說法。它所指的與我們這裡談論的兩事物 變數 的相關性,不一定是乙個意思。舉個很粗淺的例子,例如兩變數x,y之間,存在由下式表達的嚴格關係 x 0.00001 y 這是乙個嚴格的線性關係。相關係數等於1。按前面所證,x y的相關係數為1時,達到最...
探索性測試心得 一
測試的關鍵在於思想和分析能力。在任何環節下,都要思考的幾個問題。這裡面和理論上的東西很不一樣,可以讓步和需求不明確可以不覆蓋,目的是以最終完成測試目標為原則。介因存在了需求和過程不明確的比較槽糕的瀑布,計畫和實際變化太大導致之前做的完全被推翻的情況,例如細節細談討論,但沒有結果或者完全沒討論。那這個...