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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章