一句话总结:__thread修饰的全局变量每个线程各有一份实体,互不影响。初始化值只能是编译期常量。
下面例子有两个变量,__thread修饰的变量不受线程时序影响,每个线程拿到的都是初始值;而int全局变量则不同,两个线程是并发运行的,哪一行代码谁前谁后不清楚,所以fun2()打印出的g_var的值可能是10也可能是11.
#include <iostream>
#include <pthread.h>
__thread int g_own_var = 20;
int g_var = 10;
void* fun1(void* arg)
{
g_var++;
printf("fun1 g_var: %d\n", g_var);
g_own_var++;
printf("fun1 own_val: %d\n", g_own_var);
return NULL;
}
void* fun2(void* arg)
{
printf("fun2 g_var: %d\n", g_var);
printf("fun2 own_val: %d\n", g_own_var);
return NULL;
}
int main(int argc, const char * argv[]) {
// insert code here...
pthread_t pid1, pid2;
int res = pthread_create(&pid1, NULL, fun1, NULL);
if(res!=0)
{
printf("Create pthread1 error!\n");
return -1;
}
res = pthread_create(&pid2, NULL, fun2, NULL);
if(res!=0)
{
printf("Create pthread2 error!\n");
return -1;
}
pthread_join(pid1, NULL);
pthread_join(pid2, NULL);
return 0;
}