執行緒的私有資料(TSD)

2021-08-04 23:47:28 字數 991 閱讀 7338

我們知道 乙個程序內的所有執行緒繼承其資料與環境變數,共享資料空間,但是有時候我們需要有的執行緒擁有獨屬於其自己的資料變數,讓其只在某個執行緒內有效,比如最常見的errno,每個執行緒出錯的原因大不相同。 這個時候就需要建立執行緒的私有資料(tsd)了

執行緒的私有資料可以被其他函式訪問,但拒絕被其他執行緒遮蔽

tsd採用了一鍵多值的技術,即乙個鍵對應多個不同的值,每個執行緒訪問資料時通過訪問該鍵來得到對應的資料,在不同的執行緒中它對應了不同的值

其實系統為每個程序維護了乙個稱之為key結構的結構陣列,如下圖所示:

(這裡不介紹析構函式,**網路)

如圖,這個pthread_key_t(其實是unsigned int)型別的key,在程序中建立,一般為0~127

在上圖中key 結構的「標誌」指示這個資料元素是否正在使用。在剛開始時所有的標誌初始化為「不在使用」。當乙個執行緒呼叫pthread_key_create建立乙個新的執行緒特定資料元素時,系統會搜尋key結構陣列,找出第乙個「不在使用」的元素。並把該元素的索引(0~127)稱為「鍵」。 返回給呼叫執行緒的正是這個索引

key一旦被建立,所有執行緒都可以訪問它,但各執行緒可以根據自己的需要往key中填入不同的值,這就相當於提供了乙個同名而不同值的全域性變數,即一鍵多值

例:

#include

#include

#include

#include

#include

pthread_key_t key;

void *thread2( void *arg )

void *thread1( void *arg )

int main()

執行結果為:

多執行緒程式設計 執行緒私有資料(TSD)

thread specific data tsd 執行緒私有資料,有什麼用呢?在多執行緒中,經常要用全域性變數來實現多個函式間的資料共享。由於資料空間是共享的,因此全域性變數也為所有程序共有。但有時應用程式設計中必要提供執行緒私有的全域性變數,這個變數被各個執行緒私有,但卻可以跨過多個函式訪問。書上...

SDK錯誤號的原理 執行緒私有資料 TSD

個人理解 錯誤號呼叫的是同乙個變數,而每個執行緒錯誤時候自己儲存自己的錯誤數字。事實上,全域性存在某種map表 一鍵多值 每次獲取此次的執行緒錯誤,則內部根據執行緒id找到錯誤號。其中 tsd 為linux下的機制,tls 為windoss下的機制,原理類似。感謝其分享 include int pt...

執行緒特定 私有 資料

簡單的講,執行緒特定 私有 資料是每個執行緒的區域性變數,更改執行緒a中的執行緒特定 私有 資料,並不會影響到執行緒b中相對應的執行緒特定 私有 資料。常見的errno就是執行緒特定 私有 資料,每個執行緒重置errno的操作並不會影響程序中其他執行緒的errno值。下面介紹下執行緒特定資料的使用技...