Имеются ли в glibc реализации функций pthread_spin_lock() и pthread_spin_unlock() инструкции ограничения памяти?

Имеются ли в glibc реализации функций pthread_spin_lock() и pthread_spin_unlock() инструкции ограничения памяти? (Я не смог найти никаких инструкций по забору.)

Подобный вопрос имеет ответы здесь. Содержит ли pthread_mutex_lock инструкцию ограничения памяти?


person Hiro Yoshioka    schedule 13.12.2020    source источник


Ответы (1)


Имеются ли в 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_64i386), дополнительные барьеры памяти не нужны.

Но реализация powerpc использует lwarx и stwcx инструкции, которые ближе для ограничения памяти, а реализация sparc64 использует полную инструкцию membar (барьер памяти).

Вы можете увидеть различные реализации в sysdeps/.../pthread_spin_lock.* файлах в исходниках GLIBC.

person Employed Russian    schedule 13.12.2020
comment
Стоит отметить, что реализация x86_64 не нуждается в ограничениях памяти, потому что заблокированные инструкции x86 являются барьером. - person caf; 14.12.2020