Linux系統程式設計 執行緒私有屬性

2021-07-28 15:29:37 字數 3202 閱讀 3815

在多執行緒程式中,單個執行緒內需要使用全域性變數來實現不同功能之間的共享;在多個執行緒之間由於全域性變數的存在也會在多個執行緒間共享

測試**如下:

#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...