跳过导航链接 | |
退出打印视图 | |
![]() |
Oracle Solaris 11.1 链接程序和库指南 Oracle Solaris 11.1 Information Library (简体中文) |
SPARC: 常规动态 (General Dynamic, GD)
SPARC: 局部动态 (Local Dynamic, LD)
32 位 SPARC: 初始可执行 (Initial Executable, IE)
64 位 SPARC: 初始可执行 (Initial Executable, IE)
SPARC: 局部可执行 (Local Executable, LE)
32 位 x86: 常规动态 (General Dynamic, GD)
32 位 x86: 初始可执行 (Initial Executable, IE)
32 位 x86: 局部可执行 (Local Executable, LE)
x64: 常规动态 (General Dynamic, GD)
x64: 初始可执行 (Initial Executable, IE)
x64: 局部可执行 (Local Executable, LE)
使用 __thread 关键字可将变量声明为线程局部变量,如下例所示。
__thread int i; __thread char *p; __thread struct state s;
在循环优化期间,编译器可根据需要选择创建临时线程局部变量。
在 C++ 中,如果初始化需要静态构造函数,将无法初始化线程局部变量。否则,可以将线程局部变量初始化为对于普通静态变量合法的任何值。
无论是线程局部变量还是其他变量,都不能静态地初始化为线程局部变量的地址。
线程局部变量可以在外部声明和引用。线程局部变量遵循与普通符号相同的插入规则。
可用的 TLS 访问模型有多种。请参见线程局部存储的访问模型。共享目标文件开发者应意识到访问模型所带来的与目标文件装入有关的限制。共享目标文件可以在进程启动期间或进程启动之后通过延迟装入、过滤器或 dlopen(3C) 动态地装入。进程启动完成后,将建立主线程的线程指针。在线程指针建立前,会计算所有的静态 TLS 存储需求。
引用线程局部变量的共享目标文件应确保每个包含引用的转换单元都使用动态的 TLS 模型进行编译。这种访问模型可在装入共享目标文件方面提供更大的灵活性。但是,静态 TLS 模型可生成执行速度更快的代码。使用静态 TLS 模型的共享目标文件可以作为进程初始化的一部分装入。但是,进程初始化之后,使用静态 TLS 模型的共享目标文件将仅在有足够的备份 TLS 存储空间可用时才能装入。请参见程序启动。
寻址运算符 & 可用于线程局部变量。此运算符在运行时计算,并返回当前线程中变量的地址。进程中的任何线程都可自由使用此运算符获取的地址,前提是计算该地址的线程始终存在。当线程终止时,任何指向该线程中的线程局部变量的指针都将变为无效。
使用 dlsym(3C) 获取线程局部变量的地址时,返回的地址是调用 dlsym() 的线程中该变量的实例地址。