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

2021-10-01 18:06:44 字數 2415 閱讀 4614

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

1、在使用私有資料之前,你首先要建立乙個與私有資料相關的鍵,要來獲取對私有資料的訪問許可權 。這個鍵的型別是pthread_key_t

int pthread_key_create(pthread_key_t *key, void (*destructor)(voi8d*));

2、建立的鍵放在key指向的記憶體單元,destructor是與鍵相關的析構函式。當執行緒呼叫pthread_exit或者使用return返回,析構函式就會被呼叫。當析構函式呼叫的時候,它只有乙個引數,這個引數是與key關聯的那個資料的位址(也就是你的私有資料啦),因此你可以在析構函式中將這個資料銷毀。

3、鍵使用完之後也可以銷毀,當鍵銷毀之後,與它關聯的資料並沒有銷毀哦

int pthread_key_delete(pthread_key_t key);

有了鍵之後,你就可以將私有資料和鍵關聯起來,這樣就就可以通過鍵來找到資料。所有的執行緒都可以訪問這個鍵,但他們可以為鍵關聯不同的資料。(這豈不是乙個名字一樣,而值卻不同的全域性變數麼)

1、int pthread_setspecific(pthread_key_t key, const void *value);

將私有資料與key關聯

2、void *pthread_getspecific(pthread_key_t key);

獲取私有資料的位址,如果沒有資料與key關聯,那麼返回空

#include

#include

#include

#include

#include

#include

"include/pthread.h"

#ifndef _win64

#pragma comment(lib,".\\lib32\\pthreadvc2.lib")

#else

#pragma comment(lib,".\\lib64\\pthreadvc2.lib")

#endif

/*應用程式設計中有必要提供一種變數,使得多個函式多個執行緒都可以訪問這個變數(看起來是個全域性變數)

,但是執行緒對這個變數的訪問都不會彼此產生影響(貌似不是全域性變數哦),但是你需要這樣的資料,比如

errno。那麼這種資料就是執行緒的私有資料,儘管名字相同,但是每個

執行緒訪問的都是資料的副本。

1、在使用私有資料之前,你首先要建立乙個與私有資料相關的鍵,要來獲取對私有資料的訪問許可權 。這個鍵的型別是pthread_key_t

int pthread_key_create(pthread_key_t *key, void (destructor)(voi8d));

2、建立的鍵放在key指向的記憶體單元,destructor是與鍵相關的析構函式。當執行緒呼叫pthread_exit或者使用return返回,析構函式就會被呼叫。

當析構函式呼叫的時候,它只有乙個引數,這個引數是與key關聯的那個資料的位址(也就是你的私有資料啦),因此你可以在析構函式中將

這個資料銷毀。

3、鍵使用完之後也可以銷毀,當鍵銷毀之後,與它關聯的資料並沒有銷毀哦

int pthread_key_delete(pthread_key_t key);

1、int pthread_setspecific(pthread_key_t key, const void *value);

將私有資料與key關聯

2、void *pthread_getspecific(pthread_key_t key);

獲取私有資料的位址,如果沒有資料與key關聯,那麼返回空

*/pthread_key_t key;

void

*thread_fun1

(void

*arg)

void

*thread_fun2

(void

*arg)

intmain()

if(pthread_create

(&tid2,

null

, thread_fun2,

null))

//等待新執行緒結束

pthread_join

(tid1,

null);

pthread_join

(tid2,

null);

pthread_key_delete

(key)

;return0;

}

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

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

linux下C語言多執行緒(二)執行緒的私有資料

一 概念及作用 在單執行緒程式中,我們經常要用到 全域性變數 以實現多個函式間共享資料。在多執行緒環境下,由於資料空間是共享的,因此全域性變數也為所有執行緒所共有。現在有一全域性變數,所有執行緒都可以使用它,改變它的值。而如果每個執行緒希望能單獨擁有它,那麼就需要使用執行緒儲存了。表面上看起來這是乙...

linux執行緒的私有資料保護

載 linux下的線 是很有趣,各種在windows程式設計裡看不到的技巧在這裡盡顯無餘。在乙個程序裡有許多的執行緒,這些執行緒共享程序裡的所有資源。包括資料空間,所以全域性變數是為所有的執行緒所共享的。但如果執行緒裡的全域性變數為所有的執行緒所共享會出現一些問題。比如如果 量很大的話那麼名字的命名...