一尘不染

Linux的线程本地存储实现

linux

__thread Foo foo;

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


阅读 266

收藏
2020-06-03

共1个答案

一尘不染

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

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

2020-06-03