執行緒特定 私有 資料

2021-09-24 09:15:01 字數 1265 閱讀 9704

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

下面介紹下執行緒特定資料的使用技巧。

int

pthread_key_create

(pthread_key_t* keyp,

void

(*destructor)

(void*)

);

keyp鍵可以被程序中的所有執行緒使用,每個執行緒把這個鍵與不同的執行緒特定資料位址進行關聯

destructor析構函式:當執行緒呼叫pthread_exit或者執行緒執行返回,正常退出時,才被呼叫。如果呼叫了exit、_exit、_exit、abort、非正常退出時,不會被呼叫

pthread_once 一次性初始化

int

pthread_once

(pthread_once_t* initflag,

void

(*initfn)

(void))

;

我們最常使用pthread_once來確保只為我們將使用的執行緒特定資料建立乙個鍵,常用的格式見下:

void

destructor

(void*)

;pthread_ket_t key;

pthread_once_t init_done = pthread_once_init;

void

thread_init()

intthreadfunc

(void

* arg)

pthread_ket_create只是建立了key,而如果要使用key,需要將key與特定資料關聯起來

void

*pthread_getspecific

(pthread_key_t key)

;

int

pthread_setspecific

(pthread_key_t,

const

void

*value)

;

執行緒控制 私有資料

執行緒私有資料採用了一種被稱為一鍵多值的技術,即乙個鍵對應多個數值。訪問資料時都是通過鍵值來訪問,好像是對乙個變數進行訪問,其實是在訪問不同的資料。使用執行緒私有資料時,首先要為每個執行緒資料建立乙個相關聯的鍵。在各個執行緒內部,都使用這個公用的鍵來指代執行緒資料,但是在不同的執行緒中,這個鍵代表的...

執行緒的私有資料(TSD)

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

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

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