__thread是GCC內置的線程局部存儲設施,存取效率可以和全局變量相比。__thread變量每一個線程有一份獨立實體,各個線程的值互不干擾。可以用來修飾那些帶有全局性且值可能變,但是又不值得用全局變量保護的變量。
__thread使用規則:只能修飾POD類型(類似整型指針的標量,不帶自定義的構造、拷貝、賦值、析構的類型,二進制內容可以任意復制memset,memcpy,且內容可以復原),不能修飾class類型,因為無法自動調用構造函數和析構函數,可以用於修飾全局變量,函數內的靜態變量,不能修飾函數的局部變量或者class的普通成員變量,且__thread變量值只能初始化為編譯器常量(值在編譯器就可以確定const int i=5,運行期常量是運行初始化后不再改變const int i=rand()).
#include<iostream> #include<pthread.h> #include<unistd.h> using namespace std; const int i=5; __thread int var=i;//兩種方式效果一樣 //__thread int var=5;// void* worker1(void* arg); void* worker2(void* arg); int main(){ pthread_t pid1,pid2; //__thread int temp=5; static __thread int temp=10;//修飾函數內的static變量 pthread_create(&pid1,NULL,worker1,NULL); pthread_create(&pid2,NULL,worker2,NULL); pthread_join(pid1,NULL); pthread_join(pid2,NULL); cout<<temp<<endl;//輸出10 return 0; } void* worker1(void* arg){ cout<<++var<<endl;//輸出 6 } void* worker2(void* arg){ sleep(1);//等待線程1改變var值,驗證是否影響線程2 cout<<++var<<endl;//輸出6 }