在nptl / glibc中有相当大的commit-git:
http://sourceware.org/git/?p=glibc.git;a=commit;h=e51deae7f6ba2e490d5faeb8fbf4eeb32ae8f1ee
我对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))
?这个值在程序的生命周期中如何变化?
答案 0 :(得分:1)
此跳转是针对在单线程进程中使用多线程代码的情况的优化。如果在单线程进程中使用此代码,则不需要subl指令的'lock'前缀,因为不需要原子,因此可以在运行时消除。指令原子地在CPU级别产生运行时开销。
因此,简短的回答是multiple_threads
字段是一个布尔值,它告诉我们是否实际上处于多线程运行时环境中。