執行緒本地儲存(thread local storage, tls)簡單分析與使用
在多執行緒程式設計中, 同乙個變數, 如果要讓多個執行緒共享訪問, 那麼這個變數可以使用關鍵字volatile進行宣告; 那麼如果乙個變數不想使多個執行緒共享訪問, 那麼該怎麼辦呢? 呵呵, 這個辦法就是tls, 執行緒本地儲存. 它的使用非常之簡單, 只要對變數的宣告使用__declspec(thread)就ok了. 下面我來舉乙個例子, 結合注釋, 相信大家馬上就能知道其」奧秘」了.
#include "stdafx.h"
#include
__declspec(thread) int g_ndata = 0; //這就是兩個執行緒都要訪問的變數
dword winapi threadproc(lpvoid lpparameter)
;sprintf(szmsg, "auxi thread, g_ndata: %d", g_ndata);
messagebox(null, szmsg, "auxithread", mb_iconinformation);
return 0;
}int apientry winmain(hinstance hinstance,
hinstance hprevinstance,
lpstr lpcmdline,
int ncmdshow)
;sprintf(szmsg, "result: %d", g_ndata);
messagebox(null, szmsg, "mainthread", mb_iconinformation);
return 0;
}大家自己編譯執行這個程式就會發現, 如果不使用tls, 那麼結果都是10; 如果使用tls, 那麼主, 助執行緒的結果將各不影響. 這下你該知道tls是怎麼回事了吧. j
當然, 更複雜的tls, 就會需要用到windows tls的api: tlsalloc, tlsfree, tlssetvalue, tlsgetvalue了; 進一步還需要同步互斥等等.
執行緒本地儲存
對於多執行緒程式,所有執行緒共享全域性和靜態變數,任何執行緒使用變數之後都會在其他執行緒可見,因此對於執行順序非常重要的場景,需要使用多重方式來進行同步確保執行緒安全。但是,如果希望每個執行緒單獨擁有乙個全域性或靜態變數,所有執行緒都可以使用它,但是在每個執行緒中是單獨儲存的,那麼就需要使用執行緒本...
執行緒本地儲存 TLS
執行緒本地儲存 tls 是乙個方法,通過該方法,給定的多執行緒程序中的每個執行緒都可以分配儲存執行緒特定資料的位置。動態繫結 執行時 執行緒特定資料是通過 tls api tlsalloc tlsgetvalue tlssetvalue 和tlsfree 的方式支援的。除了現有的 api 實現,wi...
vc中線程的本地儲存
執行緒的本地儲存 tls tls的作用 當多個執行緒使用同乙個全域性或者靜態變數的時候 由於各個執行緒會各自對該變數賦值操作,那麼資料會被 不同的執行緒覆蓋,即這些變數對於執行緒只有乙個副本。為了各自執行緒儲存各自的資料,所以引入了tls,一旦使用了 tls,變數會對各個執行緒產生不同的副本,各個執...