36
__thread Foo foo;

“foo”实际上是如何解决的?编译器是否用函数调用静默替换“foo”的每个实例?“foo”是否存储在相对于堆栈底部的某个位置,编译器将其存储为“嘿,对于每个线程,在堆栈底部附近有这个空间,而 foo 存储为'offset x from the bottom of stack' “?

4

1 回答 1

45

它有点复杂(这个文档解释得很详细),但基本上两者都不是。相反,编译器会在可执行文件中放置一个特殊的 .tdata 部分,其中包含所有线程局部变量。在运行时,使用(只读).tdata 部分中的数据副本为每个线程创建一个新的数据部分,并且在运行时切换线程时,该部分也会自动切换。

最终结果是 __thread 变量与常规变量一样快,并且它们也不占用额外的堆栈空间。

于 2010-03-17T03:35:10.843 回答