【发布时间】:2011-03-15 09:34:45
【问题描述】:
如何从另一个线程读取/写入线程局部变量?也就是说,在线程 A 中,我想访问线程 B 的线程本地存储区中的变量。我知道另一个线程的 ID。
变量在 GCC 中被声明为 __thread。目标平台是 Linux,但独立性可能会很好(但 GCC 特定也可以)。
缺少线程启动钩子,我无法简单地在每个线程开始时跟踪该值。需要以这种方式跟踪所有线程(不仅仅是专门启动的线程)。
不能选择更高级别的包装器,例如 boost thread_local_storage 或使用 pthread 键。我需要使用真正的__thread 局部变量的性能。
第一个答案是错误的:不能将全局变量用于我想做的事情。每个线程都必须有自己的变量副本。此外,出于性能原因,这些变量必须是__thread 变量(同样有效的解决方案也可以,但我不知道)。我也不控制线程入口点,因此这些线程不可能注册任何类型的结构。
Thread Local is not private:对线程局部变量的另一个误解。这些绝不是线程的某种 private 变量。它们是全局可寻址内存,其限制是它们的生命周期与线程相关。如果给定指向这些变量的指针,则来自任何线程的任何函数都可以修改它们。上面的问题本质上是关于如何获取那个指针地址。
【问题讨论】:
-
当然,一般的想法是你不能。 :-) 为什么不让每个线程使用非本地数据结构报告其私有值?
-
大概
__thread告诉编译器它可以使用CPU 寄存器。如果是这样,由于硬件限制,这将导致无法直接访问。 -
@SpliFF,__thread 局部变量最终只是普通内存中的位置。你可以把它的地址交给另一个线程来访问。
-
@Bo,这是我对缺少启动线程挂钩的评论。我无法拦截所有线程创建并注册变量。同样,对于从拥有线程对变量的任何读取访问,我不能有函数调用的开销。
-
@edA-qamort-ora-y 我也想问一个非常相似的问题,但是对于线程本地存储的 Windows 实现。您是否有机会找到问题的答案/解决方案?
标签: c++ linux multithreading gcc thread-local-storage