__thread 存储类说明符(IBM 扩展)

__thread 存储类将静态变量标记为具有 thread-local 存储持续时间。 这意味着在多线程应用程序中,将为使用该变量的每个线程创建该变量的唯一实例,并在该线程终止时将其销毁。 __thread 存储类说明符可以提供一种确保线程安全的便捷方法: 将对象声明为每个线程允许多个线程在不考虑竞争条件的情况下访问该对象,同时避免需要低级别的线程同步编程或重要的程序重构。

tls_model 属性允许对用于给定变量的线程本地存储模型进行源级别控制。 tls_model 属性必须指定 local-execinitial-execlocal-dynamicglobal-dynamic 访问方法之一,这将覆盖该变量的 -qtls 选项。 例如:
__thread int i __attribute__((tls_model("local-exec")));

tls_model 属性允许链接程序检查是否已使用正确的线程模型来构建应用程序或共享库。 链接程序/装入程序行为如下所示:

表 1. 线程访问模型的链接时间/运行时行为
访问方法 链接时间诊断 运行时诊断
local-exec 如果导入了引用的符号,那么将失败。 如果模块不是主程序,那么失败。 如果导入了引用的符号,那么将失败 (但链接程序应该已检测到错误)。
initial-exec 无。 如果所引用的符号不在执行时装入的模块中,那么 dlopen()/load() 将失败。
local-dynamic 如果导入了引用的符号,那么将失败。 如果导入了引用的符号,那么将失败 (但链接程序应该已检测到错误)。
global-dynamic 无。 无。
注: 要识别 __thread 关键字,必须使用 -qtls 选项进行编译。 请参阅 -qtls 以获取详细信息。

说明符可以应用于具有静态存储持续时间的变量。 它不能应用于函数作用域为 或块作用域为 的自动变量 或非静态数据成员

可以在线程说明符前面或后面添加 staticextern 说明符。
__thread int i;      
extern __thread struct state s;      
static __thread char *p;

仅限 C + +线程变量必须用常量表达式初始化。仅限 C + +

将地址运算符 (&) 应用于线程局部变量将返回当前线程的变量实例的运行时地址。 该线程可以将此地址传递给任何其他线程; 但是,当第一个线程终止时,指向其线程局部变量的任何指针都将变为无效。