1. 程式人生 > >POSIX執行緒:執行緒私有資料

POSIX執行緒:執行緒私有資料

概念及作用

  執行緒私有資料(thread-specify data,TSD)類似於全域性變數,可以跨函式使用,區別是TSD是執行緒私有的。

建立和登出

int pthread_key_create(pthread_key_t *key, void (*destr_func)(void *))

    key,函式從TSD池中分配一項,所建立的是所有執行緒都能訪問的,但各個執行緒可以根據自己需要往key中寫填不同的值,相當於提供了一個同名但不同值的全域性變數。

    destr,執行緒退出時,呼叫destr_func函式,釋放分配的記憶體。但是如果線上程退出前,呼叫了pthread_key_delete函式,那麼已退出執行緒的destr_func函式永遠不會被呼叫了,所以應確保所有使用key的執行緒退出後,呼叫pthread_key_delete函式。一般可以在主執行緒等待所有執行緒退出後,呼叫pthread_key_delete函式。

int pthread_key_delete(pthread_key_t key)

  這個函式並不檢查是否有thread正在使用該TSD,也不會呼叫清理函式destr_func,而只是將TSD釋放。

訪問

int pthread_setspecific(pthread_key_t key, const void *p);

void pthread_getspecific(pthread_key_t key);

在LinuxThreads中,使用了一個位於執行緒描述結構(_pthread_descr_struct)中的二維void *指標陣列來存放與key關聯的資料,陣列大小由以下幾個巨集來說明:

#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值經過類似計算得到資料所在位置索引,再取出其中內容返回。