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"
其中$0
为futex地址 0, %P3
为MULTIPLE_THREADS_OFFSET常数。
那么,$gs:MULTIPLE_THREADS_OFFSET
(又名$gs:(offsetof (tcbhead_t, multiple_threads))
)中存储了什么?这个值在程序的生命周期中是如何改变的?
此跳转是针对在单线程进程中使用多线程代码的情况进行的优化。如果在单线程进程中使用此代码,则不需要subl指令的'lock'前缀,因为原子上不需要,因此可以在运行时消除。指令会自动导致CPU级别的运行时开销。
所以,简短的回答是multiple_threads
字段是一个布尔值,它告诉我们是否实际上处于多线程运行时环境中。