从另一个线程访问线程本地
如何从另一个线程读取/写入线程局部变量?也就是说,在线程A中,我想访问线程B的线程本地存储区域中的变量。我知道另一个线程的ID。
该变量在GCC中声明为
__thread
。目标平台是Linux,但独立性可能不错(但GCC具体可行)。
缺少线程启动挂钩,我无法在每个线程的开头简单地跟踪此值。需要以这种方式跟踪所有线程(不仅仅是特别启动的线程)。
像boost boost_local_storage或使用pthread键的更高级别的包装器不是一个选项。我要求使用真正的__thread
局部变量。
第一个答案是错误的:人们不能将全局变量用于我想做的事情。每个线程必须有自己的变量副本。此外,出于性能原因,这些变量必须是__thread
变量(同样有效的解决方案也可以,但我知道没有)。我也不控制线程入口点,因此这些线程不可能注册任何类型的结构。
线程本地不是私有的:另一个关于线程局部变量的误解。这些线程绝不是某种私有变量。它们是全局可寻址的内存,其限制是它们的生命周期与线程相关联。任何线程中的任何函数,如果给出指向这些变量的指针,都可以修改它们。上面的问题主要是关于如何获得指针地址。
没有找到相关结果
已邀请:
3 个回复
奥李
的海湾合作委员会文件说: 当运营商的地址是 应用于线程局部变量,它 在运行时进行评估并返回 当前线程的地址 该变量的实例。一个地址 如此获得的任何线程都可以使用。 当一个线程终止时,任何指针 到那里的线程局部变量 线程变得无效。 因此,如果你坚持这样做,我想可以在线程产生之后从它所属的线程中获取线程局部变量的地址。然后,您可以将指向该内存位置的指针存储到映射(thread id => pointer),并让其他线程以这种方式访问该变量。这假定您拥有生成的线程的代码。 如果你真的喜欢冒险,你可以尝试挖掘
的信息(从这个由上述GCC文档链接的PDF开始)。但是这种方法具有如此高度的编译器和平台特性,因此缺乏文档,它应该导致警报在任何人的头脑中消失。
翁茄口霉氖
。 因此,为了访问线程本地数据,您应该通过该指针进行操作。 换句话说:
演示以上假设g ++,linux,pthreads的代码是:
掸牛浓疗