JavaScript is required to for searching.
跳过导航链接
退出打印视图
链接程序和库指南     Oracle Solaris 10 8/11 Information Library (简体中文)
search filter icon
search icon

文档信息

前言

1.  Oracle Solaris 链接编辑器介绍

2.  链接编辑器

3.  运行时链接程序

4.  共享目标文件

5.  应用程序二进制接口与版本控制

6.  支持接口

7.  目标文件格式

8.  线程局部存储

C/C++ 编程接口

线程局部存储节

线程局部存储的运行时分配

程序启动

创建线程

启动后动态装入

延迟分配线程局部存储块

线程局部存储的访问模型

SPARC: 线程局部变量访问

SPARC: 常规动态 (General Dynamic, GD)

SPARC: 局部动态 (Local Dynamic, LD)

32 位 SPARC: 初始可执行 (Initial Executable, IE)

64 位 SPARC: 初始可执行 (Initial Executable, IE)

SPARC: 局部可执行 (Local Executable, LE)

SPARC: 线程局部存储的重定位类型

32 位 x86: 线程局部变量访问

32 位 x86: 常规动态 (General Dynamic, GD)

x86: 局部动态 (Local Dynamic, LD)

32 位 x86: 初始可执行 (Initial Executable, IE)

32 位 x86: 局部可执行 (Local Executable, LE)

32 位 x86: 线程局部存储的重定位类型

x64: 线程局部变量访问

x64: 常规动态 (General Dynamic, GD)

x64: 局部动态 (Local Dynamic, LD)

x64: 初始可执行 (Initial Executable, IE)

x64: 局部可执行 (Local Executable, LE)

x64: 线程局部存储的重定位类型

9.  Mapfile

A.  链接编辑器快速参考

B.  版本控制快速参考

C.  使用动态字符串标记建立依赖性

D.  直接绑定

E.  System V 发行版 4(版本 1)Mapfile

F.  链接程序和库的更新及新增功能

索引

C/C++ 编程接口

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

__thread int i;
__thread char *p;
__thread struct state s;

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

适用性
__thread 关键字可以应用于任何全局变量、文件作用域静态变量或函数作用域静态变量。它对于始终是线程局部变量的自动变量没有影响。
初始化

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

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

绑定

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

动态装入限制

可用的 TLS 访问模型有多种。请参见线程局部存储的访问模型。共享目标文件开发者应意识到访问模型所带来的与目标文件装入有关的限制。共享目标文件可以在进程启动期间或进程启动之后通过延迟装入、过滤器或 dlopen(3C) 动态地装入。进程启动完成后,将建立主线程的线程指针。在线程指针建立前,会计算所有的静态 TLS 存储需求。

引用线程局部变量的共享目标文件应确保每个包含引用的转换单元都使用动态的 TLS 模型进行编译。这种访问模型可在装入共享目标文件方面提供更大的灵活性。但是,静态 TLS 模型可生成执行速度更快的代码。使用静态 TLS 模型的共享目标文件可以作为进程初始化的一部分装入。但是,进程初始化之后,使用静态 TLS 模型的共享目标文件将仅在有足够的备份 TLS 存储空间可用时才能装入。请参见程序启动

寻址运算符

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

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