0

nptl/glibc 中有相当大的 commit-git:

http://sourceware.org/git/?p=glibc.git;a=commit;h=e51deae7f6ba2e490d5faeb8fbf4eeb32ae8f1ee

作者:Ulrich Drepper 和 Jakub Jelinek @ 2007

我对更改 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"

其中futex 地址为零并且$0是MULTIPLE_THREADS_OFFSET 常量。%P3

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

4

1 回答 1

1

此跳转是针对单线程进程中使用多线程代码的情况进行的优化。如果您在单线程进程中使用此代码,则不需要 subl 指令的“锁定”前缀,因为不需要原子,因此可以在运行时消除。指令以原子方式在 CPU 级别产生运行时开销。

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

于 2011-11-17T06:33:19.817 回答