线程局部变量和fs段

Met*_*est 10 c linux multithreading gcc x86-64

我在我的代码中读取线程局部变量,如下所示,

// tid_local is declared as __thread int tid_local;
long tid = tid_local
Run Code Online (Sandbox Code Playgroud)

看看反汇编的代码,我看到了类似的东西,我怀疑这是通过读取tid_local来指定tid的指令.

movslq %fs:0xfffffffffffffffc,%rbx
Run Code Online (Sandbox Code Playgroud)

现在我的问题是,这是否真的可以成为执行此操作的指令,即从本地线程变量读取,以及gcc是否始终使用fs段存储线程局部变量.这应该怎么样?

NPE*_*NPE 12

是的,这可能是正确的指示.从gcc 手册:

-mtls-direct-seg-refs

-mno-tls-direct-seg-refs

控制是否可以使用TLS段寄存器的偏移量访问TLS变量(32位为%gs,64位为%fs),或者是否必须添加线程基址指针.这是否合法取决于操作系统,以及它是否映射该段以覆盖整个TLS区域.

编辑以下是@janneb在评论中提出的一个很好的链接:http://www.akkadia.org/drepper/tls.pdf

  • @MetallicPriest:好吧,每个线程都有自己的一组寄存器值(对于**所有**寄存器,而不仅仅是`fs`). (2认同)
  • @MetallicPriest:段未保存,它是指向保存的段**的寄存器的**值.每个线程都有不同的`fs`值. (2认同)