2

在 Windows 和 Linux 下,给定一个线程句柄,我如何确定其对应的静态线程本地存储块的开始和结束?

4

3 回答 3

4

您可以在线程信息块中找到此信息。但是请注意,这样做会访问未记录的结构,因此非常不便携,并且可能会在未来版本的 Windows 中中断。看来您可以从 TIB获取当前线程的线程本地存储区;我不确定你会得到另一个线程的 TLS。

您可以尝试深入研究 TIB 中偏移 0x30 处的进程环境块 (PEB),但同样,您正在处理可能会更改的未记录结构。

于 2008-12-05T22:54:49.697 回答
2

Windows 线程信息块给出了 FS:0x2C 处的线程本地存储数组的地址,它是指向每个模块的 TLS 的指针数组。问题是没有指示该数组有多大,或者每个模块 TLS 数据块有多大。

于 2008-12-06T19:40:25.033 回答
1

有关各种线程本地存储相关功能的详细信息,请参阅MSDN 。您可以使用TlsGetValue()来获取特定的 TLS 值;不要在内存中四处寻找,即使它有效 - 你只是在调用未定义的行为,它恰好可以工作,但在未来的 Windows 版本中可能会发生中断。

于 2008-12-05T19:59:46.040 回答