【问题标题】:Do the glibc implementation of pthread_spin_lock() and pthread_spin_unlock() function have memory fence instructions?pthread_spin_lock() 和 pthread_spin_unlock() 函数的 glibc 实现是否有内存围栏指令?
【发布时间】:2021-03-24 06:59:37
【问题描述】:

pthread_spin_lock() 和 pthread_spin_unlock() 函数的 glibc 实现是否有内存栅栏指令? (我找不到任何围栏说明。)

类似的问题在这里有答案。 Does pthread_mutex_lock contains memory fence instruction?

【问题讨论】:

    标签: pthreads glibc spinlock


    【解决方案1】:

    pthread_spin_lock()和pthread_spin_unlock()函数的glibc实现有内存栅栏指令吗?

    没有实现——每个支持的处理器都有一个实现。

    x86_64 实现不使用内存栅栏;它使用lock 前缀代替:

    gdb -q /lib/x86_64-linux-gnu/libpthread.so.0
    
    (gdb) disas pthread_spin_lock
    Dump of assembler code for function pthread_spin_lock:
       0x00000000000108c0 <+0>:     lock decl (%rdi)
       0x00000000000108c3 <+3>:     jne    0x108d0 <pthread_spin_lock+16>
       0x00000000000108c5 <+5>:     xor    %eax,%eax
       0x00000000000108c7 <+7>:     retq   
       0x00000000000108c8 <+8>:     nopl   0x0(%rax,%rax,1)
       0x00000000000108d0 <+16>:    pause  
       0x00000000000108d2 <+18>:    cmpl   $0x0,(%rdi)
       0x00000000000108d5 <+21>:    jg     0x108c0 <pthread_spin_lock>
       0x00000000000108d7 <+23>:    jmp    0x108d0 <pthread_spin_lock+16>
    

    由于lock-prefixed 指令已经是x86_64(和i386)上的内存屏障,因此不需要额外的内存屏障。

    但powerpc实现使用lwarxstwcxinstructions,更接近“内存栅栏”,而sparc64实现使用完整的membar(内存屏障)指令。

    您可以在 GLIBC 源代码中的 sysdeps/.../pthread_spin_lock.* 文件中查看各种实现。

    【讨论】:

    • 值得指出的是,x86_64 实现不需要内存栅栏,因为 x86 锁定指令是一个障碍。
    猜你喜欢
    • 2014-07-31
    • 1970-01-01
    • 2013-09-09
    • 2019-09-07
    • 2017-12-07
    • 2013-03-04
    • 2012-07-02
    • 2016-08-30
    • 1970-01-01
    相关资源
    最近更新 更多