在多執行緒程式中,單個執行緒內需要使用全域性變數來實現不同功能之間的共享;在多個執行緒之間由於全域性變數的存在也會在多個執行緒間共享
測試**如下:
#include #include #include #include #include #include /*
1)建立執行緒私有資料
int pthread_key_create(pthread_key_t *key, void (*destructor)(void*));
功能:建立乙個型別為 pthread_key_t 型別的私有資料變數( key )。
引數:返回值:
成功:0
失敗:非 0
不論哪個執行緒呼叫 pthread_key_create(),所建立的 key 都是所有執行緒可訪問,但各個執行緒可根據自己的需要往 key 中填入不同的值,相當於提供了乙個同名不同值的變數。
2)登出執行緒私有資料
int pthread_key_delete(pthread_key_t key);
功能:登出執行緒私有資料。這個函式並不會檢查當前是否有執行緒正使用執行緒私有資料( key ),也不會呼叫清理函式 destructor() ,而只是將執行緒私有資料( key )釋放以供下一次呼叫 pthread_key_create() 使用。
引數:key:待登出的私有資料。
返回值:
成功:0
失敗:非 0
3)設定執行緒私有資料的關聯
int pthread_setspecific(pthread_key_t key, const void *value);
功能:設定執行緒私有資料( key ) 和 value 關聯,注意,是 value 的值(不是所指的內容)和 key 相關聯。
引數:key:執行緒私有資料。
返回值:
成功:0
失敗:非 0
4)讀取執行緒私有資料所關聯的值
void *pthread_getspecific(pthread_key_t key);
功能:讀取執行緒私有資料( key )所關聯的值。
引數:key:執行緒私有資料。
返回值:
成功:執行緒私有資料( key )所關聯的值。
失敗:null
*/
#include #include pthread_key_t key; // 私有資料,全域性變數
void echomsg(void *t)
void *child1(void *arg)
void *child2(void *arg)
int main(void)
執行結果如下:
由執行結果可以看出,其中乙個執行緒對全域性變數的修改將影響到另乙個執行緒的訪問。
比如在程式裡可能需要每個執行緒維護乙個鍊錶,而會使用相同的函式來操作這個鍊錶,最簡單的方法就是使用同名而不同變數位址的執行緒相關資料結構。
這樣的資料結構可以由 posix 執行緒庫維護,成為執行緒私有資料 (thread-specific data,或稱為 tsd)。
示例**如下:
/*
1)建立執行緒私有資料
int pthread_key_create(pthread_key_t *key, void (*destructor)(void*));
功能:建立乙個型別為 pthread_key_t 型別的私有資料變數( key )。
引數:返回值:
成功:0
失敗:非 0
不論哪個執行緒呼叫 pthread_key_create(),所建立的 key 都是所有執行緒可訪問,但各個執行緒可根據自己的需要往 key 中填入不同的值,相當於提供了乙個同名不同值的變數。
2)登出執行緒私有資料
int pthread_key_delete(pthread_key_t key);
功能:登出執行緒私有資料。這個函式並不會檢查當前是否有執行緒正使用執行緒私有資料( key ),也不會呼叫清理函式 destructor() ,而只是將執行緒私有資料( key )釋放以供下一次呼叫 pthread_key_create() 使用。
引數:key:待登出的私有資料。
返回值:
成功:0
失敗:非 0
3)設定執行緒私有資料的關聯
int pthread_setspecific(pthread_key_t key, const void *value);
功能:設定執行緒私有資料( key ) 和 value 關聯,注意,是 value 的值(不是所指的內容)和 key 相關聯。
引數:key:執行緒私有資料。
返回值:
成功:0
失敗:非 0
4)讀取執行緒私有資料所關聯的值
void *pthread_getspecific(pthread_key_t key);
功能:讀取執行緒私有資料( key )所關聯的值。
引數:key:執行緒私有資料。
返回值:
成功:執行緒私有資料( key )所關聯的值。
失敗:null
*/
#include #include pthread_key_t key; // 私有資料,全域性變數
void echomsg(void *t)
void *child1(void *arg)
void *child2(void *arg)
int main(void)
執行結果如下:
從執行結果來看,各執行緒對自己的私有資料操作互不影響。也就是說,雖然 key 是同名且全域性,但訪問的記憶體空間並不是同乙個。
此函式非常好,看起來我們雖然是繫結的同乙個key,但是通過設定繫結操作,將同乙個key對映到了不同位址的資料
總結:pthread_key_create 建立執行緒私有資料結構
pthread_setspecific 設定執行緒與私有資料的關聯關係
pthread_getspecific 獲得與執行緒相關聯的key 的具體資料
pthread_key_delete 取消執行緒與繫結的資料之間的關聯
Linux系統程式設計 執行緒私有資料
在多執行緒程式中,經常要用全域性變數來實現多個函式間的資料共享。由於資料空間是共享的,因此全域性變數也為所有執行緒共有。測試 如下 include include include include int key 100 全域性變數 由執行結果可以看出,其中乙個執行緒對全域性變數的修改將影響到另乙個執...
Linux系統程式設計17 執行緒屬性
執行緒屬性 設定分離屬性。pthread attr t attr 建立乙個執行緒屬性結構體變數 pthread attr init attr 初始化執行緒屬性 pthread attr setdetachstate attr,pthread create detached 設定執行緒屬性為分離態 p...
linux系統程式設計 執行緒
include int pthread create pthread t thread,const pthread attr t attr,void start routine void void arg include include include include include include...