執行緒特定資料(學習)

2021-06-28 05:13:24 字數 1605 閱讀 7001

1、首先,為什麼要使用執行緒特定資料呢?什麼是執行緒特定資料。這牽涉到重入函式和不可重入函式。

重入函式就是在多個程序或者執行緒中,可以同時進行執行的函式,可重入函式就是不可以同時執行的函式,這個主要是可能多個程序或執行緒共享了乙個變數,這個變數只有乙個,這樣同時執行的時候,就會出問題了,因為我們不知道這個靜態變數具體是存入的什麼值,可能剛存入乙個值,立馬又因為呼叫這個函式程式設計另外乙個值。更加通俗的說,

在函式體內不訪問那些全域性變數,不使用靜態

區域性變數,堅持只使用區域性變數,寫出的函式就將是可重入的。如果必須訪問全域性變數,記住利用互斥訊號量來保護全域性變數。

好了,說了這麼多,如果多個執行緒同時訪問乙個函式,而這個函式恰好也必須使用乙個靜態變數,那麼,執行緒特定資料就是來解決這個問題的。

2、每乙個系統支援的執行緒特定資料元素限制不一樣。posix要求這個限制不小於128(每一格程序)。系統為每乙個程序維護乙個稱之為key結構的結構陣列。如圖1

key結構中額標誌指示這個陣列元素是否正在使用。當乙個執行緒呼叫程序建立函式pthread_key_create時候,系統搜尋該程序的key結構陣列找到第乙個不使用的的元素,該元素的索引稱之為鍵,返回給呼叫執行緒的正是這個索引。

除了程序範圍內的key結構陣列外,系統還在程序內維護關於每乙個執行緒的多條資訊。這些特定於執行緒的資訊我們稱之為pthread結構,如圖2

pthread結構與key結構是一一對應的。當建立乙個執行緒的時候,系統會根據key結構搜尋,得到乙個返回值,也就是key結構的索引,每乙個執行緒可以為該鍵值儲存乙個值(指標)。這個指標通常是通過malloc獲取的。如圖3。這樣,當乙個函式有乙個靜態變數的時候,多個執行緒同時訪問,因為這個靜態變數存放在鍵值中,就不會存在乙個執行緒將另外乙個執行緒的值覆蓋的情況了。

執行緒特定函式的典型用法如下:

[cpp]view plain

copy

pthread_key_t r1_key;  

pthread_once_t re_once = pthread_once_init;  

//定義析構函式,釋放空間

void

readline_destructor(

void

*ptr)  

//初始化函式

void

readline_once(

void

)    

ssize_t  

readline(...)  

.....  

}  

每一次readline被呼叫的時候,它都呼叫pthread_once,根據r1_once的值(pthread_once_init),readline這個函式值被呼叫了一次。pthread_getspecific()獲取相應的特定執行緒資料,pthread_setspecific()設定特定執行緒資料。

執行緒特定資料

執行緒特定資料也稱執行緒私有資料,是儲存和查詢某個特定執行緒相關資料的一種機制。在分配執行緒特定資料之前,需要建立與該資料相關聯的鍵,以用於獲取對執行緒特定資料的訪問。使用函式 pthread key create 可建立乙個鍵,而對所有的執行緒,都可以通過 pthread key delete 來...

Linux執行緒 執行緒特定資料

在單執行緒程式中。我們常常要用到 全域性變數 以實現多個函式間共享資料,然而在多執行緒環境下。因為資料空間是共享的。因此全域性變數也為全部執行緒所共同擁有。但有時應用程式設計中有必要提供執行緒私有的全域性變數,僅在某個執行緒中有效,但卻能夠跨多個函式訪問。posix執行緒庫通過維護一定的資料結構來解...

執行緒特定資料(筆記)

執行緒特定資料,也稱為執行緒私有資料,是儲存和查詢某個特定資料相關資料的一種機制。在單執行緒程式中,我們經常要用到 全域性變數 以實現多個函式間共享資料。在多執行緒環境下,由於資料空間是共享的,因此全域性變數也為所有所有執行緒所共有。但有時應用程式設計中有必要提供執行緒私有的全域性變數,僅在某個執行...