链接程序和库指南

C/C++ 编程接口

使用 __thread 关键字可将变量声明为线程局部变量,如下例所示。

__thread int i;

__thread char *p;

__thread struct state s;

在循环优化期间,编译器可根据需要选择创建临时线程局部变量。

适用性

__thread 关键字可以应用于任何全局变量、文件范围的静态变量或函数范围的静态变量。它对始终为线程局部变量的自动变量没有影响。

初始化

在 C++ 中,如果初始化需要静态构造函数,则无法初始化线程局部变量。否则,可以将线程局部变量初始化为对普通静态变量合法的任何值。

无论是线程局部变量还是其他变量都不能静态初始化为线程局部变量的地址。

绑定

可以在外部声明和引用线程局部变量。线程局部变量遵循与普通符号相同的插入规则。

动态装入限制

可以在进程启动期间或进程启动之后通过延迟装入、过滤器或 dlopen(3C) 动态装入共享库。如果使用动态 TLS 模型编译每个包含对线程局部变量的引用的转换单元,则可以在启动后装入包含该引用的共享库。

静态 TLS 模型生成执行速度更快的代码。但是,编译为使用此模型的代码不能在启动后动态装入的库中引用线程局部变量。动态 TLS 模型可以引用所有 TLS。这些模型将在线程局部存储的访问模型中介绍。

寻址运算符

寻址运算符 & 可用于线程局部变量。此运算符在运行时计算,并返回当前线程中变量的地址。进程中的任何线程都可自由使用由此运算符获取的地址,只要计算该地址的线程仍然存在。当线程终止时,指向该线程中的线程局部变量的所有指针将变为无效。

使用 dlsym(3C) 获取线程局部变量的地址时,返回的地址是调用 dlsym() 的线程中该变量的实例地址。