NPTL:什么是MULTIPLE_THREADS_OFFSET以及它是如何设置的



nptl/glibc:

http://sourceware.org/git/?p=glibc.git; =提交;h = e51deae7f6ba2e490d5faeb8fbf4eeb32ae8f1ee

作者:Ulrich Drepper和Jakub Jelinek @ 2007

我想更改lll_lock/lll_unlock

SMP代码中,lll_unlock被修改为

+# define __lll_unlock_asm "cmpl $0, %%gs:%P3nt"                            
+                         "je 0fnt"                                         
+                         "lockn"                                            
+                         "0:tsubl $1,%0nt"

其中$0futex地址 0, %P3为MULTIPLE_THREADS_OFFSET常数。

那么,$gs:MULTIPLE_THREADS_OFFSET(又名$gs:(offsetof (tcbhead_t, multiple_threads)))中存储了什么?这个值在程序的生命周期中是如何改变的?

此跳转是针对在单线程进程中使用多线程代码的情况进行的优化。如果在单线程进程中使用此代码,则不需要subl指令的'lock'前缀,因为原子上不需要,因此可以在运行时消除。指令会自动导致CPU级别的运行时开销。

所以,简短的回答是multiple_threads字段是一个布尔值,它告诉我们是否实际上处于多线程运行时环境中。

相关内容

  • 没有找到相关文章

最新更新