有相当巨大的承诺,混帐到NPTL/glibc的:NPTL:什么是MULTIPLE_THREADS_OFFSET以及它是如何设置
http://sourceware.org/git/?p=glibc.git;a=commit;h=e51deae7f6ba2e490d5faeb8fbf4eeb32ae8f1ee
由乌利齐·德雷珀和的Jakub耶利内克@ 2007
我感兴趣the change to lll_lock/lll_unlock
在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"
其中$0
是 futex地址零和%P3
是MULTIPLE_THREADS_OFFSET常量。
那么,什么是储存在$gs:MULTIPLE_THREADS_OFFSET
(又名$gs:(offsetof (tcbhead_t, multiple_threads))
?怎么这个值在程序的生命周期被改变?
setate by allocate_stack,nptl/allocatestack.c:['374/*这至少是第二个线程。 */ 375 pd-> header.multiple_threads = 1;'](http://fxr.watson.org/fxr/source/nptl/allocatestack.c?v=GLIBC27#L374) – osgx