有3种类型: 以名字空间作为作用域, 类的静态数据成员, 普通局部变量
thread_local int tt=2; //1. 以namespace作为作用域
class X
{
static thread_local int i; //2. 类的静态数据成员
};
void fun()
{
thread_local int j; //3. 普通的线程局部变量
}
类的静态数据成员(2.)和namespace为作用域(1.)的变量:
初次使用之前完成构造, 可能是在变量初次使用才构造, 或者线程启动之时就构造, 总之无法保证使用前就已构造好
普通的线程局部变量(3.):
当流程第一次到达该变量时才构造, 如果函数从没调用, 函数内却声明了线程局部变量, 则不会发生构造, 如图静态局部变量一样( ?调用了函数却没执行声明语句呢?)
线程局部变量和静态局部变量一样, 先进行0值初始化, 再进行动态初始化(非0值初始化和非常量初始化之外), 如果线程局部变量的构造函数抛出异常, 程序就会完全终止
如果线程从exit退出, 线程局部变量会被销毁, 但其他线程的线程局部变量仍保留不析构
不同线程里, 线程局部变量的地址不同, 可以通过取值地址传递给其他线程, 但要保证线程结束变量销毁后, 其他线程不能再对其访问