Linux的线程本地存储实现

\uuuuuu线程Foo-Foo;

“foo”实际上是如何解决的?编译器是否会用函数调用悄悄地替换“foo”的每个实例?“foo”是否存储在相对于堆栈底部的某个位置,编译器将其存储为“嘿,对于每个线程,将此空间存储在堆栈底部附近,而foo存储为‘从堆栈底部的偏移量x’”

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

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

发表评论