线程局部存储 Thread Local Storage(tls),是一种机制,通过这一机制分配的变量,每个当前线程有一个该变量的实例。
在用户层,用一个新的存储类型关键字:__thread
表示这一扩展。
__thread
使用规则:
- 如果一个线程局部存储变量有一个初始化器,它必须是常量表达式。
__thread
限定符可以单独使用,也可带有extern
或static
限定符,但不能带有其它存储类型的限定符。- 当一个线程终止时,任何该线程中的线程局部存储变量都不再有效。
- 不能修饰 class 类型,因为无法自动调用构造函数和析构函数。
- 可以用于修饰全局变量,函数内的静态变量,不能修饰函数的局部变量或者class的普通成员变量。
#include <stdio.h>
#include <pthread.h>
static __thread int var = 5;
void *worker1()
{
++var;
printf("worker1,var is: %d,address is: %p\n", var, &var);
}
void *worker2()
{
sleep(3);
++var;
printf("worker2,var is: %d,address is: %p\n", var, &var);
}
int main()
{
pthread_t t1, t2;
pthread_create(&t1, NULL, worker1, NULL);
pthread_create(&t2, NULL, worker2, NULL);
pthread_join(t1, NULL);
pthread_join(t2, NULL);
return 0;
}
输出:
worker1,var is: 6,address is: 0x7f21d75236fc
worker2,var is: 6,address is: 0x7f21d6d226fc