如何找到线程本地存储的开头和结尾?

时间:2008-12-05 19:53:04

标签: windows linux multithreading winapi pthreads

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

3 个答案:

答案 0 :(得分:4)

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

您可以尝试深入研究流程环境块(PEB),位于TIB的偏移量0x30处,但同样,您正在处理可能发生变化的未记录的结构。

答案 1 :(得分:2)

Windows线程信息块提供FS:0x2C处的线程本地存储阵列的地址,这是指向每个模块的TLS的指针数组。问题是没有迹象表明该阵列有多大,或者每个模块TLS数据块有多大。

答案 2 :(得分:1)

有关各种与线程本地存储相关的函数的详细信息,请参阅MSDN。您可以使用TlsGetValue()获取特定的TLS值;不要在内存中进行讨论,即使它有效 - 你只是调用未定义的行为,这种行为恰好可以工作,但可能会在未来版本的Windows中出现故障。