Linux多執行緒實踐(四 )執行緒的特定資料

2021-09-08 13:06:48 字數 2608 閱讀 2677

在單執行緒程式中。我們常常要用到"全域性變數"以實現多個函式間共享資料, 然而在多執行緒環境下。因為資料空間是共享的。因此全域性變數也為全部執行緒所共同擁有。但有時應用程式設計中有必要提供

執行緒私有的全域性變數,僅在某個執行緒中有效,但卻能夠跨多個函式訪問

。posix執行緒庫通過維護一定的資料結構來解決問題。這個些資料稱為(thread-specific-data或 tsd)。

相關函式例如以下:

從上圖可知:當呼叫pthread_key_create 後會產生乙個全部執行緒都可見的執行緒特定資料(tsd)的鍵值(如上圖中全部的執行緒都會得到乙個pkey[1]的值), 可是這個鍵所指向的真實資料卻是不同的,儘管都是pkey[1], 可是他們並非指向同一塊記憶體,而是指向了僅僅屬於自己的實際資料, 因此, 假設執行緒0更改了pkey[1]所指向的資料, 而並不可以影像到執行緒n;

/** 演示樣例1:運用pthread_once, 讓key僅僅初始化一次 

注意: 將對key的初始化放入到init_routine中

**/

pthread_key_t key;

pthread_once_t once_control = pthread_once_init;

typedef struct tsd

tsd_t;

//執行緒特定資料銷毀函式,

//用來銷毀每乙個執行緒所指向的實際資料

void destructor_function(void *value)

//初始化函式, 將對key的初始化放入該函式中,

//能夠保證inti_routine函式僅僅執行一次

void init_routine()

void *thread_routine(void *args)

int main()

執行結果例如以下:

init....

thread1 setspecific ,address: 0x7fe7a00008c0

tid: 0xa8192700, str = thread1

thread2 setspecific ,address :0x7fe7980008c0

tid: 0xa7991700 ,str = thread2

tid: 0xa8192700 ,str = thread1

tid: 0xa7001700 ,str = thread2

destructor...

destructor...

主線程建立了兩個執行緒然後join 等待他們退出;給每乙個執行緒的執行函式都是thread_routine,thread_routine 中呼叫了pthread_once,此函式表示假設當第乙個執行緒呼叫它時會執行once_routine,然後從once_routine返回即pthread_once 返回,而接下去的其它執行緒呼叫它時將不再執行once_routine。此舉是為了僅僅呼叫pthread_key_create 一次,即產生乙個pthread_key_t 值。

在thread_routine 函式中自己定義了執行緒特定資料的型別。對於不同的執行緒來說tsd的內容不同,如果執行緒1在第一次列印完進入睡眠的時候。執行緒2也開始執行並呼叫pthread_setspecific 繫結執行緒2的tsd 和key_t,此時執行緒1呼叫pthread_getspecific 返回key_t 繫結的tsd指標,仍然是執行緒1的tsd指標,即儘管key_t 僅僅有乙個,但每乙個執行緒都有自己的tsd。

特定資料。具有128

項,通過

key-value

實現,乙個執行緒建立乙個key

,其它執行緒也會建立。可是並非指向的同一快記憶體。他們指向自己的資料。

這就是執行緒特定資料。

上述**中,即使是sleeep(2),執行緒1

的資料並不會被執行緒

2的資料所影響。由於是執行緒私有的。

當執行緒退出的時候會銷毀2

次,由於建立了兩個執行緒。

當中tid 是執行緒的id,str 是傳遞給thread_routine 的引數,能夠看到有兩個不同的ptr,且destroy 呼叫兩次。

另外,關於linux/unix執行緒私有資料實現思想:

請參考 寫的非常好。

ios 多執行緒之四 執行緒鎖

假如我們在功能的實現過程中,類中有乙個全域性變數,我們建立了多個執行緒去同時改變或者使用這個變數,會出現什麼問題?執行緒鎖就是用來解決多執行緒之間對資源共享的問題 在上文 多執行緒之三 的基礎之上進行演示,模仿多個地點進行售票的案例。1 建立按鈕 問題 當多個執行緒執行某一塊相同 需要執行緒鎖進行保...

C 基礎 多執行緒筆記 四 執行緒池

現在到了關於多線最簡單使用的最後一篇筆記。無論從什麼角度來看,每一項事物都應該有其所在的空間,而對於執行緒來說,執行緒池就是它所存在的空間,或者叫容器了。接下來,看看這個執行緒池是如何使用的吧!概念 manualresetevent,通知乙個或多個正在等待的執行緒已發生事件 manualresete...

Java多執行緒程式設計四 執行緒間通訊

一 等待和通知機制 1.經過前面的知識學習,我們先來看一下如果才能讓兩個執行緒互相通訊資料呢?編碼兩個執行緒如下 public class notifythread extends thread override public void run catch interruptedexception ...