Имеются ли в glibc реализации функций pthread_spin_lock() и pthread_spin_unlock() инструкции ограничения памяти?
Не существует реализации — есть реализации для каждого поддерживаемого процессора.
Реализация 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
уже являются барьером памяти для x86_64
(и i386
), дополнительные барьеры памяти не нужны.
Но реализация powerpc использует lwarx
и stwcx
инструкции, которые ближе для ограничения памяти, а реализация sparc64 использует полную инструкцию membar
(барьер памяти).
Вы можете увидеть различные реализации в sysdeps/.../pthread_spin_lock.*
файлах в исходниках GLIBC.
person
Employed Russian
schedule
13.12.2020