NPTEL:什么是MULTIPLE THREADS OFFSET以及它是如何设置的

时间:2011-11-17 04:25:28

标签: multithreading glibc nptl

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

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

    Drepper和Jakub Jelinek @ 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))?这个值在程序的生命周期中如何变化?

1 个答案:

答案 0 :(得分:1)

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

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