【发布时间】:2021-03-24 06:59:37
【问题描述】:
pthread_spin_lock() 和 pthread_spin_unlock() 函数的 glibc 实现是否有内存栅栏指令? (我找不到任何围栏说明。)
类似的问题在这里有答案。 Does pthread_mutex_lock contains memory fence instruction?
【问题讨论】:
pthread_spin_lock() 和 pthread_spin_unlock() 函数的 glibc 实现是否有内存栅栏指令? (我找不到任何围栏说明。)
类似的问题在这里有答案。 Does pthread_mutex_lock contains memory fence instruction?
【问题讨论】:
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实现使用lwarx和stwcxinstructions,更接近“内存栅栏”,而sparc64实现使用完整的membar(内存屏障)指令。
您可以在 GLIBC 源代码中的 sysdeps/.../pthread_spin_lock.* 文件中查看各种实现。
【讨论】: