Oracle® Solaris Studio 12.4:C++ 用户指南

退出打印视图

更新时间: 2014 年 12 月
 
 

4.2 线程局部存储

通过声明线程局部变量,可以利用线程局部存储。 线程局部变量声明普通变量声明与声明说明符 __thread 组成。有关更多信息,请参见-xthreadvar[=o]

不使用 -features=extensions 选项即可识别 __thread 关键字。在 C++11 模式中,__thread 关键字等效于 C++11 thread_local 关键字。

必须将 __thread 说明符包括在第一个线程变量声明中。使用 __thread 说明符声明的变量的绑定方式与没有 __thread 说明符时相同。

在 C++03 或 -compat=5 模式中,只能使用 __thread 说明符声明静态持续时间的变量。具有静态持续时间的变量包括了文件全局、文件静态、函数局部静态和类静态成员。不能使用 __thread 说明符声明动态或自动持续时间的变量。线程变量可以具有静态初始化函数,但是不可以具有动态初始化函数或析构函数。例如,允许 __thread int x = 4;,但不允许 __thread int x = f();。线程变量不能包含具有重要构造函数和析构函数的类型。具体来说,就是线程变量的类型不能为 std::string

在 C++11 模式中,可以使用 __threadthread_local 说明符声明自动持续时间的变量。目前不支持动态初始化函数。

运行时对线程变量的地址运算符 (&) 求值并返回当前线程变量的地址。因此,线程变量的地址不是常量。

线程变量的地址在相应线程的生命周期中是稳定的。进程中任何线程都可以在线程变量的生命周期任意使用该变量的地址。不能在线程终止后使用线程变量的地址。线程变量的所有地址在线程终止后都是无效的。