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

2021-06-09 16:07:24 字數 1599 閱讀 4921

一. 概念及作用

在單執行緒程式中,我們經常要用到"全域性變數"以實現多個函式間共享資料。在多執行緒環境下,由於資料空間是共享的,因此全域性變數也為所有執行緒所共有。現在有一全域性變數,所有執行緒都可以使用它,改變它的值。而如果每個執行緒希望能單獨擁有它,那麼就需要使用執行緒儲存了。表面上看起來這是乙個全域性變數,所有執行緒都可以使用它,而它的值在每乙個執行緒中又是單獨儲存的。這就是執行緒儲存的意義。這樣的資料結構可以由posix執行緒庫維護,稱為執行緒私有資料(thread-specific data,或tsd)。

具體用法如下:

1.建立乙個型別為pthread_key_t型別的變數。

3.當執行緒中需要儲存特殊值的時候,可以呼叫pthread_setspcific()。該函式有兩個引數,第乙個為前面宣告的pthread_key_t變數,第二個為void*變數,這樣你可以儲存任何型別的值。

4.如果需要取出所儲存的值,呼叫pthread_getspecific()。該函式的引數為前面提到的pthread_key_t變數,該函式返回void *型別的值。

#define pthread_key_2ndlevel_size 32

#define pthread_key_1stlevel_size \

((pthread_keys_max + pthread_key_2ndlevel_size - 1)

/ pthread_key_2ndlevel_size)

其中在/usr/include/bits/local_lim.h中定義了pthread_keys_max為1024,因此一維陣列大小為32。而具體存放的位置由key值經過以下計算得到:

idx1st = key / pthread_key_2ndlevel_size

idx2nd = key % pthread_key_2ndlevel_size

也就是說,資料存放與乙個32×32的稀疏矩陣中。同樣,訪問的時候也由key值經過類似計算得到資料所在位置索引,再取出其中內容返回。

四. 使用範例

以下這個例子說明如何使用這一機制達到儲存執行緒私有資料的目的。

[cpp]view plain

copy

#include 

#include 

pthread_key_t key;   

void echomsg(int t)   

void * child1(void *arg)   

void * child2(void *arg)   

int main(void)   

執行結果如下:

hello

thread 1082350784 enter

thread 1090739264 enter

thread 1090739264 returns 1090739264

thread 1082350784 returns 1082350784

main thread exit

給例程建立兩個執行緒分別設定同乙個執行緒私有資料為自己的執行緒id,為了檢驗其私有性,程式錯開了兩個執行緒私有資料的寫入和讀出的時間,從程式執行結果可以看出,兩個執行緒對tsd的修改互不干擾。同時,當執行緒退出時,清理函式會自動執行,引數為tid。

Linux多執行緒程式設計(二) 執行緒屬性

pthread介面允許我們通過設定每個物件關聯的不同屬性來細調執行緒的行為。include int pthread attr init pthread attr t attr int pthread attr destroy pthread attr t attr 兩個函式的返回值 若成功,返回0 ...

c 多執行緒thread操作(二)執行緒管理

c 多執行緒thread操作 一 環境部署 c 多執行緒thread操作 二 執行緒管理 c 多執行緒thread操作 三 資料競爭互斥訪問 c 多執行緒thread操作 四 死鎖的問題和解決 c 多執行緒thread操作 五 unique lock加鎖 c 多執行緒thread操作 六 條件變數的...

Java多執行緒系列(二) 執行緒安全

個人主頁 tuzhenyu s page 多執行緒併發操作下可能出現記憶體不可見問題,指令重排序問題,4位元組賦值問題等,主要造成執行緒不安全的還是記憶體不可見和指令重排序 非執行緒安全出現的情況主要是多執行緒同時對乙個共享可變變數進行讀寫操作,因此可以通過以下三種方法解決非執行緒安全問題 將可變變...