nptl/glibc 中有相当大的 commit-git:
http://sourceware.org/git/?p=glibc.git;a=commit;h=e51deae7f6ba2e490d5faeb8fbf4eeb32ae8f1ee
作者:Ulrich Drepper 和 Jakub Jelinek @ 2007
在 SMP 代码中, lll_unlock 被修改为
+# define __lll_unlock_asm "cmpl $0, %%gs:%P3\n\t" \
+ "je 0f\n\t" \
+ "lock\n" \
+ "0:\tsubl $1,%0\n\t"
其中futex 地址为零并且$0
是MULTIPLE_THREADS_OFFSET 常量。%P3
那么,存储在什么位置$gs:MULTIPLE_THREADS_OFFSET
(又名$gs:(offsetof (tcbhead_t, multiple_threads))
?这个值在程序的生命周期中是如何变化的?