__thread關鍵字

 __thread是GCC內置的線程局部存儲設施,存取效率可以和全局變量相比。__thread變量每一個線程有一份獨立實體,各個線程的值互不干擾。可以用來修飾那些帶有全局性且值可能變,但是又不值得用全局變量保護的變量。

       __thread使用規則:只能修飾POD類型(類似整型指針的標量,不帶自定義的構造、拷貝、賦值、析構的類型,二進制內容可以任意複製memset,memcpy,且內容可以復原),不能修飾class類型,因爲無法自動調用構造函數和析構函數,可以用於修飾全局變量,函數內的靜態變量,不能修飾函數的局部變量或者class的普通成員變量,且__thread變量值只能初始化爲編譯器常量(值在編譯器就可以確定const int i=5,運行期常量是運行初始化後不再改變const int i=rand()).

 

  1. #include<iostream>  
  2. #include<pthread.h>  
  3. #include<unistd.h>  
  4. using namespace std;  
  5. const int i=5;  
  6. __thread int var=i;//兩種方式效果一樣  
  7. //__thread int var=5;//  
  8. void* worker1(void* arg);  
  9. void* worker2(void* arg);  
  10. int main(){  
  11.     pthread_t pid1,pid2;  
  12.     //__thread int temp=5;  
  13.     static __thread  int temp=10;//修飾函數內的static變量  
  14.     pthread_create(&pid1,NULL,worker1,NULL);  
  15.     pthread_create(&pid2,NULL,worker2,NULL);  
  16.     pthread_join(pid1,NULL);  
  17.     pthread_join(pid2,NULL);  
  18.     cout<<temp<<endl;//輸出10  
  19.     return 0;  
  20. }  
  21. void* worker1(void* arg){  
  22.     cout<<++var<<endl;//輸出 6  
  23. }  
  24. void* worker2(void* arg){  
  25.     sleep(1);//等待線程1改變var值,驗證是否影響線程2  
  26.     cout<<++var<<endl;//輸出6  
  27. }  
程序輸出:

6

6         //可見__thread值線程間互不干擾

10



轉自:http://blog.csdn.net/liuxuejiang158blog/article/details/14100897

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