動態tls的使用

2021-08-15 17:04:30 字數 1600 閱讀 4020

多執行緒的時候最好不要使用全域性和靜態變數,因為如果乙個執行緒改變了全域性變數的值,另乙個執行緒在不知情的情況下有可能引用這個變數導致不可預料的錯誤

我們先舉個例子

假設兩個執行緒各自從0-9999計數

如果我們這樣寫

main.cpp

#include 

#include

dword winapi workthread(lpvoid param);

dword g_dwnumber = 0;//舊版有問題

int main()

waitformultipleobjects(2, hthread, true, infinite);

printf("%d", g_tlsindex);

system("pause");

return0;}

dword winapi workthread(lpvoid param)

return

0;}

執行結果

最後的計數結果達到了19999,很顯然是錯誤的

這個時候就是動態tls派上用場的時候了,動態tls其實就是為每個執行緒建立乙個與其關聯的記憶體塊,這個記憶體塊可以當陣列使用

tlsalloc可以分配乙個沒有用過的索引給你,讓你在裡面寫入東西

這裡需要注意的一點是只要申請了乙個索引,所有的執行緒都能使用這個索引,但是索引所在位置的內容是與執行緒相關的

打個比方,乙個市有市長,副市長,地稅局長,國稅局長,招商局張,教育局長等等,市就相當於執行緒,而省相當於程序,每個市的市長和副市長都是不一樣,所以說,每個執行緒每個tls陣列相關索引裡面的內容都是跟執行緒相關的

使用動態tls需要4個函式

tlsalloc() 分配可用的tls索引

tlsfree(dword dwtlsindex) 釋放索引,這樣下次可以繼續使用

tlssetvalue(dword dwtlsindex,lpvoid p) 為tls陣列索引位置設定資料

tlsgetvalue(dword dwtlsindex) 獲取tls陣列索引位置的資料

下面我們舉個例子吧

#include 

#include

dword winapi workthreadnew(lpvoid param);

dword g_tlsindex = 0;//tls新增

大功告成

TLS 配置和使用

tls 配置和使用 該源 裡包含了tls的配置和相應的證書檔案。資料夾 證書 裡包含證書,pjproject中tls的支援需要在檔案config site.h中增加預編譯 define pj has ssl sock 1。但是好像有問題,需要在h projects hsp01 dep bin sta...

執行緒區域性儲存(TLS)的使用

將執行緒的私有資料 區域性儲存的資料 共享,以供本程序中的其它執行緒使用。l 適用情形 執行緒區域性儲存適用於多執行緒共享資料,而又不需要同步的情形。執行緒同步的開支比較大。l 原理 在每個執行緒中有乙個儲存區域,該儲存區域有64個slot 資料槽 可以通過該slot的索引值 乙個dword數值 獲...

執行緒區域性儲存tls的使用

執行緒區域性儲存 thread local storage,tls 主要用於在多執行緒中,儲存和維護一些執行緒相關的資料,儲存的資料會被關聯到當前執行緒中去,並不需要鎖來維護。因此也沒有多執行緒間資源競爭問題,那如何去實現tls儲存呢,主要有以下幾種方式 gcc和clang的 thread修飾符 w...