Apakah implementasi glibc dari fungsi pthread_spin_lock() dan pthread_spin_unlock() memiliki instruksi pagar memori?
Tidak ada implementasi yang -- yang ada adalah implementasi sebuah untuk setiap prosesor yang didukung.
Implementasi x86_64
tidak menggunakan pagar memori; ia menggunakan awalan lock
sebagai gantinya:
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>
Karena instruksi yang diawali lock
sudah menjadi penghalang memori pada x86_64
(dan i386
), tidak diperlukan penghalang memori tambahan.
Namun implementasi powerpc menggunakan lwarx
dan stwcx
petunjuk, yang lebih mendekati ke pagar memori, dan implementasi sparc64 menggunakan instruksi penuh membar
(penghalang memori).
Anda dapat melihat berbagai implementasi dalam file sysdeps/.../pthread_spin_lock.*
di sumber GLIBC.
person
Employed Russian
schedule
13.12.2020