线程特定数据存储与线程取消机制详解
在多线程编程中,线程特定数据存储(TSD)和线程取消机制是两个重要的概念。下面将详细介绍这两个概念及其相关实现细节。
线程特定数据存储(TSD)
线程特定数据存储(TSD)是一种为每个线程提供独立数据副本的机制。它允许每个线程拥有自己的全局变量,这些变量在不同线程之间是相互独立的。
替代方法:线程局部存储(TLS)
线程局部存储(TLS)是提供 TSD 功能的另一种方法。它允许声明一组全局变量为“线程局部”变量,这些变量可以像普通全局变量一样使用,但不需要加锁。然而,TLS 存在一些严重的局限性:
- 需要更改编译器或进行复杂的内存映射操作。
- 无法动态分配新的键,TLS 段在链接时是固定的。
- 不具有可移植性。
由于 Pthreads 委员会无法要求更改编译器,因此选择指定 TSD 而不是 TLS。Win32 除了支持 TSD 外,还实现了静态 TLS,它确实需要编译器支持。
全局变量、常量与特殊处理
TSD 键是一个共享的全局变量。通常,使用共享数据时应该加锁,但存在例外情况。如果能保证全局变量的值永远不会改变,那么在使用时可以不加锁,此时该键实际上被当作常量处理。
对于任何用作常量的全局声明变量,也适用同样的规则。如果要进行这种“特殊处理”,必须确保只从一个线程(通常是初始线程)设置该变量,并且在创建其他线程之前完成设置。该变量必须作为常量使用,永远不能更改,否则会导致各种问题。
另一种可以在临界区外处理共享数据的情况是,当不需要数据值完全正确时。例如,对变量进行测试,并根据其可