縮寫為tls。程序中的全域性變數與函式內定義的靜態(static)變數,是各個執行緒都可以訪問的共享變數。在乙個執行緒修改的記憶體內容,對所有執行緒都生效。這是乙個優點也是乙個缺點。說它是優點,執行緒的資料交換變得非常快捷。說它是缺點,乙個執行緒死掉了,其它執行緒也性命不保; 多個執行緒訪問共享資料,需要昂貴的同步開銷,也容易造成同步相關的bug。
如果需要在乙個執行緒內部的各個函式呼叫都能訪問、但其它執行緒不能訪問的變數(被稱為static memory local to a thread 執行緒區域性靜態變數),就需要新的機制來實現。這就是tls。
執行緒區域性儲存在不同的平台有不同的實現,可移植性不太好。幸好要實現執行緒區域性儲存並不難,最簡單的辦法就是建立乙個全域性表,通過當前執行緒id去查詢相應的資料,因為各個執行緒的id不同,查到的資料自然也不同了。
大多數平台都提供了執行緒區域性儲存的方法,無需要我們自己去實現:
linux:
int pthread_key_create(pthread_key_t *key, void (*destructor)(void*));
int pthread_key_delete(pthread_key_t key);
void *pthread_getspecific(pthread_key_t key);
int pthread_setspecific(pthread_key_t key, const void *value);
win32
dword global_dwtls_fvalue = tlsalloc();
注意,此步之後,當前執行緒實際上訪問的是這個tls陣列索引變數的執行緒內的拷貝版本。也就說,不同執行緒雖然看起來用的是同名的tls陣列索引變數,但實際上各個執行緒得到的可能是不同dword值。其意義在於,每個使用tls的執行緒獲得了乙個dword型別的執行緒區域性靜態變數作為tls陣列的索引變數。c/c++原本沒有直接定義執行緒區域性靜態變數的機制,所以在如此大費周折。
第二步,為當前執行緒動態分配一塊記憶體區域(使用localalloc()函式呼叫),然後把指向這塊記憶體區域的指標放入tls陣列相應的槽中(使用tlsvalue()函式呼叫)。
void* p_fvalue = localalloc(lptr,sizeof(float));
tlssetvalue( global_dwtls_fvalue, p_fvalue);
第三步,在當前執行緒的任何函式內,都可以通過tls陣列的索引變數,使用tlsgetvalue()函式得到上一步的那塊記憶體區域的指標,然後就可以進行記憶體區域的讀寫操作了。這就實現了在乙個執行緒內部這個範圍處處可訪問的變數。
lpvoid lpvdata = tlsgetvalue(global_dwtls_fvalue);
*lpvdata = (float) 3.1416; //應用該執行緒區域性儲存
最後,如果不再需要上述執行緒區域性靜態變數,要動態釋放掉這塊記憶體區域(使用localfree()函式),然後從tls陣列中放棄對應的槽(使用tlsfree()函式)。
localfree((hlocal) p_fvalue );
tlsfree(global_dwtls_fvalue);
sniffer技術資料
sniffer中文翻譯過來就是嗅探器。是一中威脅性極大的被動攻擊工具!使用在個攻擊可以監視網路的狀態。資料流動情況以及網路上傳輸的資訊,便可以用網路監聽到方式來進行攻擊,截獲網上的資訊。所以黑客常常喜歡用他來截獲使用者口令!sniffer可以分為兩類乙個是硬體的乙個軟體的,今天給大家講的主要是軟體的...
Cisco技術資料彙總
bcsi 配置ripv1 v2 配置eigrp 配置單區域ospf和多區域的ospf路由協議 配置多區域的isis路由協議 配置策略路由 配置在各種igp都相互存在的環境下的路由重分布 配置ibgp和ebgp 利用bgp的各種不同的屬性來調節bgp的選路 配置組播的pim 路由協議,spm,dm 配...
Windows phone開發入門 技術資料索引庫
windows phone具有桌面定製 圖示拖拽 滑動控制等一系列前衛的操作體驗。其主螢幕通過提供類似儀錶盤的體驗來顯示新的電子郵件 簡訊 未接來電 日曆約會等,讓人們對重要資訊保持時刻更新。它還包括乙個增強的觸控螢幕介面,更方便手指操作 以及乙個最新版本的ie mobile瀏覽器 該瀏覽器在一項由...