该变量在GCC中被声明为__thread.目标平台是Linux,但独立性可能不错(GCC具体可以).
缺少一个线程启动钩子,没有办法我可以在每个线程的开头简单地跟踪这个值.所有线程都需要以这种方式进行跟踪(不只是特别开始的).
更高级的包装器,如boost thread_local_storage或使用pthread键不是一个选项.我需要使用一个真实的__thread局部变量.
第一个答案是错误的:我不能使用全局变量来做我想做的事情.每个线程都必须有自己的变量副本.此外,由于性能原因,这些变量必须是__thread变量(同样有效的解决方案也可以,但我知道没有).我也没有控制线程入口点,因此这些线程不可能注册任何类型的结构.
线程本地不是私有的:对线程局部变量的另一个误解.这些线程绝对不是某种私有变量.它们是全局可寻址的内存,限制其使用寿命与线程相关.任何函数,从任何线程,如果指定这些变量的指针可以修改它们.上面的问题本质上是关于如何获取该指针地址.
解决方法
重要澄清!
我不是建议您使用单个全局替换线程局部变量.我建议使用单个全局数组或其他合适的值集合来替换一个线程局部变量.
您将必须提供同步的课程,但是由于您想要将在线程A中修改的值公开给线程B,所以不会有变化.
更新:
GCC documentation on __thread
说:
When the address-of operator is
applied to a thread-local variable,it
is evaluated at run-time and returns
the address of the current thread’s
instance of that variable. An address
so obtained may be used by any thread.
When a thread terminates,any pointers
to thread-local variables in that
thread become invalid.
因此,如果你坚持要这样做,我会想到有可能从它所属的线程获取一个线程局部变量的地址,就在线程生成之后.然后,您可以将指向该存储器位置的指针存储到映射(线程id =>指针),并让其他线程以这种方式访问变量.这假设你拥有生成的线程的代码.
如果你真的很冒险,可以尝试挖掘___tls_get_addr(从this PDF开始,由上述GCC文档链接)的信息.但是这种方法是如此高度的编译器和平台特定的,因此在文档中缺乏应该引起警报的任何人的头脑.