gcc 中__thread 關鍵字的示例程式碼
阿新 • • 發佈:2019-01-07
__thread 關鍵字的解釋:
Thread Local Storage
執行緒區域性儲存(tls)是一種機制,通過這一機制分配的變數,每個當前執行緒有一個該變數的例項. gcc用於實現tls的執行時模型最初來自於IA-64處理器的ABI,但以後被用到其它處理器上。 它需要連結器(ld),動態聯結器(ld.so)和系統庫(libc.so,libpthread.so)的全力支援.因此它不是到處可用的。
注意:__thread 前面是兩個_別鬧錯哦; 示例程式碼:
執行緒區域性儲存(tls)是一種機制,通過這一機制分配的變數,每個當前執行緒有一個該變數的例項. gcc用於實現tls的執行時模型最初來自於IA-64處理器的ABI,但以後被用到其它處理器上。 它需要連結器(ld),動態聯結器(ld.so)和系統庫(libc.so,libpthread.so)的全力支援.因此它不是到處可用的。
注意:__thread 前面是兩個_別鬧錯哦; 示例程式碼:
1 #include<iostream> 2#include<pthread.h> 3 #include <unistd.h> 4 #define D "-----------------------------------------" 5 using namespace std; 6 7 8 static __thread int a=12; 9 10 11 void *thread1(void *arg); 12 void *thread2(void *arg); 13 14 int main() 15 { 16 pthread_t pid,pid1;17 18 pthread_create(&pid,NULL,thread1,NULL); 19 pthread_create(&pid1,NULL,thread2,NULL); 20 21 22 pthread_join(pid,NULL); 23 pthread_join(pid,NULL); 24 25 cout<<"main_a="<<a<<"\t"<<"addr_a="<<&a<<endl;26 27 28 } 29 30 void *thread1(void *arg) 31 { 32 cout<<"I am thread1"<<endl; 33 cout<<"a="<<a<<"\t"<<&a<<endl; 34 sleep(1); 35 a=1; 36 cout<<"thread1->a="<<a<<"\t"<<"add_a="<<&a<<endl; 37 cout<<D<<endl; 38 return NULL; 39 } 40 void *thread2(void *arg) 41 { 42 43 cout<<"I am thread2"<<endl; 44 45 cout<<"a="<<a<<"\t"<<&a<<endl; 46 a=2; 47 cout<<"thread2->a="<<a<<"\t"<<"add_a="<<&a<<endl; 48 cout<<D<<endl; 49 return NULL; 50 }
執行結果:
[email protected]:~$ ./a.out I am thread2 a=12 0x7f7912b4a6fc thread2->a=2 add_a=0x7f7912b4a6fc ----------------------------------------- I am thread1 a=12 0x7f791334b6fc thread1->a=1 add_a=0x7f791334b6fc ----------------------------------------- main_a=12 addr_a=0x7f79144b473c
分析:
該程式為了測試這個關鍵字的作用;
介紹一下程式,
首先在一開始定義一個全域性變數a=12,其次宣告連個執行緒的回撥函式這兩個函式作用,
用於先列印一下a的值然後再改變在列印a的值,至於為什麼這樣做,是想驗證一下他是不是寫時拷貝,
然後主程式就是開闢兩個執行緒並等待其完成最後再列印一下a的值及地址來確定主執行緒是否有影響;
最終分析:
通過結果我們可以看到這個關鍵字作用是,只要其他執行緒用它他會直接在自己的執行緒棧上建立該物件並保留其原有的值;
不會干擾其他執行緒中的該值;