**載)linux下的線**是很有趣,各種在windows程式設計裡看不到的技巧在這裡盡顯無餘。在乙個程序裡有許多的執行緒,這些執行緒共享程序裡的所有資源。包括資料空間,所以全域性變數是為所有的執行緒所共享的。但如果執行緒裡的全域性變數為所有的執行緒所共享會出現一些問題。比如如果**量很大的話那麼名字的命名都是乙個問題。如果兩個執行緒有相同的全域性erron變數那麼執行緒2可以會用到執行緒1的出錯提示。
這個問題可以通過建立執行緒的私有資料來解決(thread-specific data,tsd)。乙個執行緒裡的tsd只有這個執行緒可以訪問。
tsd採用了一種稱之為私有資料的技術,即乙個鍵對應多個資料值。意思就好比用乙個資料結構,這個結構的結構名就是鍵值,在這個結構裡有許多的資料,這些資料封閉在這個結構裡。執行緒可以通過這個結構名即鍵值來訪問其所屬的資料結構。
建立tsd有三個步驟:建立乙個鍵(即建立乙個資料結構),為這個鍵設定執行緒的私有資料(即為這個結構體裡的資料賦值)。刪除鍵值。
三個步驟分別對應的系統函式了:
int pthread_key_create(pthread_key_t *key, void (*destructor)(void*));
int pthread_setspecific(pthread_key_t key, const void *value);
int pthread_key_delete(pthread_key_t key);
建立了tsd後執行緒可以用下面的函式來讀取資料。
void *pthread_getspecific(pthread_key_t key);
下面**演示建立tsd:
1 #include2 #include3 #include4
5pthread_key_t key;67
void *thread2(void *arg)815
16void *thread1(void *arg)
1728
29int
main()
30
在編譯的時候要用到pthread.a庫,形式為:
ong@ubuntu:~/myjc/myc$ gcc -o tsd tsd.c -lpthread
Linux多執行緒5 4 執行緒私有資料
應用程式設計中有必要提供一種變數,使得多個函式多個執行緒都可以訪問這個變數 看起來是個全域性變數 但是執行緒對這個變數的訪問都不會彼此產生影響 貌似不是全域性變數哦 但是你需要這樣的資料,比如errno。那麼這種資料就是執行緒的私有資料,儘管名字相同,但是每個 執行緒訪問的都是資料的副本。1 在使用...
執行緒特定 私有 資料
簡單的講,執行緒特定 私有 資料是每個執行緒的區域性變數,更改執行緒a中的執行緒特定 私有 資料,並不會影響到執行緒b中相對應的執行緒特定 私有 資料。常見的errno就是執行緒特定 私有 資料,每個執行緒重置errno的操作並不會影響程序中其他執行緒的errno值。下面介紹下執行緒特定資料的使用技...
執行緒的私有資料(TSD)
我們知道 乙個程序內的所有執行緒繼承其資料與環境變數,共享資料空間,但是有時候我們需要有的執行緒擁有獨屬於其自己的資料變數,讓其只在某個執行緒內有效,比如最常見的errno,每個執行緒出錯的原因大不相同。這個時候就需要建立執行緒的私有資料 tsd 了 執行緒的私有資料可以被其他函式訪問,但拒絕被其他...