Oracle® Solaris 11.2 链接程序和库指南

退出打印视图

更新时间: 2014 年 7 月
 
 

延迟分配线程局部存储块

在动态 TLS 模型中,当线程 t 需要访问目标文件 m 的 TLS 块时,代码将更新 dtvt 并执行 TLS 块的初始分配。线程库将提供以下接口以便动态分配 TLS。

typedef struct {
        unsigned long ti_moduleid;
        unsigned long ti_tlsoffset;
} TLS_index;

extern void *__tls_get_addr(TLS_index *ti);     (SPARC and x64)
extern void *___tls_get_addr(TLS_index *ti);    (32–bit x86)

注 - 此函数的 SPARC 和 64 位 x86 定义具有相同的函数签名。但是,32 位 x86 版本不使用缺省调用约定来传递栈中的参数。相反,32 位 x86 版本通过更有效的 %eax 寄存器来传递其参数。为了指示将使用此替代调用方法,32 位 x86 函数的名称中有三个前导下划线。

这两个版本的 tls_get_addr() 都会检查每线程生成计数器 gent,以确定是否需要更新向量。如果 dtvt 向量已过时,例程将更新此向量,可能会重新分配此向量以便为更多项留出空间。然后,例程将检查与 dtvt,m 对应的 TLS 块是否已分配。如果该向量尚未分配,例程将分配并初始化该块。例程使用运行时链接程序提供的初始化记录列表中的信息。dtv t,m 指针被设置为指向已分配的块。例程返回一个指向块中给定偏移的指针。