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

2021-08-09 08:14:52 字數 1375 閱讀 7527

thread specific data(tsd)

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

書上是這樣說的:

int pthread_key_create(pthread_key_t *key, void (*destructor)(void*));
另外還有:

int pthread_setspecific(pthread_key_t key, const void *value);
當執行緒中需要儲存特殊值的時候,可以呼叫 pthread_setspcific() 。該函式有兩個引數,第乙個為前面宣告的pthread_key_t變數,第二個為void*變數,這樣你可以儲存任何型別的值。

void *pthread_getspecific(pthread_key_t key);
如果需要取出所儲存的值,呼叫pthread_getspecific()。該函式的引數為前面提到的pthread_key_t變數,該函式返回void *型別的值。

下面用例子來說明:

#include #include pthread_key_t key;

pthread_once_t once = pthread_once_init; // pthread_once 保證 create_key 只被執行一次

void create_key()

}void display()

void * worker(void *arg)

int main()

輸出如下:

init pthread_key

9c6e5f40 9c6e5f40

i'm 2624481024

9bee4f40 9bee4f40

i'm 2616088320

pthread_getspecific() 返回的是與key 相關聯資料的指標。需要注意的是,在利用這個返回的指標時,它首先是 void 型別的,它雖然指向關聯的資料位址處,但並不知道指向的資料型別,所以在具體使用時,要對其進行強制型別轉換。其次,兩個執行緒對自己的私有資料操作是互相不影響的。也就是說,雖然 key 是同名且全域性,但訪問的記憶體空間並不是相同的乙個。此外,各執行緒可以用 key 繫結不同型別的資料(我這裡都繫結的 int )。

執行緒的私有資料(TSD)

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

Linux多執行緒5 4 執行緒私有資料

應用程式設計中有必要提供一種變數,使得多個函式多個執行緒都可以訪問這個變數 看起來是個全域性變數 但是執行緒對這個變數的訪問都不會彼此產生影響 貌似不是全域性變數哦 但是你需要這樣的資料,比如errno。那麼這種資料就是執行緒的私有資料,儘管名字相同,但是每個 執行緒訪問的都是資料的副本。1 在使用...

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

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