C語言執行緒物件和執行緒儲存的實現

2022-09-25 03:21:13 字數 1972 閱讀 6936

當每個執行緒為各自的變數使用全域性標程式設計客棧識符時,為保留這些變數各自的資料,可以採用執行緒物件(thread-local object)和執行緒儲存(thread-specific storage)。

這兩項技術允許在乙個給定執行緒中執行的函式可以共享資料而不造成衝突,即便當其他執行緒也在執行同樣函式的情況下。

執行緒物件是在宣告中包含新儲存類修飾符 _threacbjnfld_local 的全域性或靜態物件。這意味著:每乙個執行緒擁有屬於自己的執行緒物件例項,它**程啟動時建立並初始化。物件的儲存週期等於執行緒的執行時間。在乙個執行緒內表示式裡面的執行緒物件名,將引用這個物件在當前執行緒下的本地例項。

修飾符 _thread_local 可以與修飾符 static 或 extern 同時使用。標頭檔案 threads.h 定義了 thread_local 作為 _thread_local 的同義詞。在例 1 中,主線程和新啟動執行緒各自擁有執行緒本地變數 var 的乙個例項。

【例1】使用乙個執行緒物件

#include

#include

thread_local int var = 10;

void print_var(void)

int func(void *); // 執行緒函式

int main(int argc, char *ar**)

print_var(); // 輸出:var = 10

thrd_join(th1, null);

return 0;

}int func(void *arg) // 執行緒函式

執行緒儲存技術要比執行緒物件更加靈活。例如,獨立執行緒可以使用不同大小的記憶體。它們可以動態地分配記憶體,並通過呼叫析構函式再次釋放記憶體。同時,可以使用相同的識別符號訪問這些獨立執行緒所在的不同記憶體區域。

這種靈活性通過初始建立乙個全域性的鍵(key)實現,該鍵表示了乙個指向執行緒儲存的指標。然後,獨立執行緒通過指定其執行緒儲存的位置載入這個指標。該全域性鍵值是型別為 tss_t 的物件。標頭檔案 threads.h 包含了該型別的定義以及 4 個用於管理執行緒儲存(簡稱 tss)函式的宣告:

int tss_create(tss_t*key,tss_dtor_t dtor);

通過析構函式 dtor 生成乙個新的 tss 指標,並且將 key 引用的物件設定為唯一標識該 tss 指標的值。型別 tss_dtor_t 是乙個函式指標,定義為 void(*)(void*)(它指的是乙個函式指標,該函式引數為 void 指標,並且該函式沒有返回值)。dtor 的返回值可以是乙個空指標。

void tss_delete(tss_t key);

釋放 tss 鍵 key 所使用的所有資源。

int tss_set(tss_t key,void*val);

對於呼叫 tss_set()的執行緒,將 key 所標識的 tss 指標設定為 val 所引用的記憶體位址。

void*tss_get(tss_t key);

返回指向記憶體塊的指標,該記憶體塊為正在呼叫的執行緒通過函式 tss_set()設定。如果發生錯誤,tss_get()返回 null。

如果函式 tss_create()和 tss_set()發生錯誤,則返回 thrd_error;否則,返回 thrd_success。

例 2 中的程式在動態分配的執行緒儲存中,保留執行緒的名稱。

【例2】使用執行緒儲存

#include

#include

#include

#include

tss_t key; // 用於tss指標的全域性鍵

int thfunc(void *arg); // 執行緒函式

void destructor(void *data); // 析構函式

int main(void)

void print(void) // 顯示執行緒儲存

int thfunc( void *arg )

void destructor(void *data)

執行緒安全和執行緒儲存

include 函式功能 routine指向的函式加入到呼叫執行緒的清理函式棧 void pthread cleanup push void routine void void pthread cleanup pop int execute 注意 pthread cleanup push和pthre...

執行緒篇 執行緒的實現和執行緒安全

執行緒的實現?作業系統關於 執行緒實現 使用者級 執行緒核心級 執行緒組合模型 使用者級 執行緒建立 管理 銷毀,都由執行緒庫 完成開銷比較小 作業系統對執行緒的存在一無所知,作業系統只能看到程序,而不能看到執行緒。這種模式最致命的缺點也是由於作業系統不知道執行緒的存在,因此當乙個程序中的某乙個執行...

多執行緒 簡單的執行緒建立,C語言實現

執行緒,是計算機中最小的執行單元。通常,在window應用程式執行時,作業系統都會為其自動建立乙個執行緒,即主線程。通過主線程,可以建立多個執行緒或程序。使用多執行緒,可以提高程式的執行效率。執行緒建立函式createthread 屬於api函式 函式原型為 handle createthread ...