是否使用"内存屏障"实现了linux的"互斥锁"?

nom*_*igt 3 linux posix mutex linux-kernel

我正在阅读这篇文章,其中Robert Love提到互斥是使用内存屏障实现的,但我无法看到在Linux实现互斥锁时使用的内存屏障指令.

我想知道他是否指的是posix库中的互斥锁实现,它确实使用了内存屏障指令,因此它不会对关键资源进行重新排序.我对吗?

Tsy*_*rev 10

Robert Love的答案适用于任何领域的互斥体.

您引用的linux内核中的实现使用__mutex_fastpath_lock,它执行大部分工作并且通常使用汇编代码实现.例如,在x86_64上,它的实现可能是:

 20 static inline void __mutex_fastpath_lock(atomic_t *v,
 21                                          void (*fail_fn)(atomic_t *))
 22 {
 23         asm_volatile_goto(LOCK_PREFIX "   decl %0\n"
 24                           "   jns %l[exit]\n"
 25                           : : "m" (v->counter)
 26                           : "memory", "cc"
 27                           : exit);
 28         fail_fn(v);
 29 exit:
 30         return;
 31 }
Run Code Online (Sandbox Code Playgroud)

这里的关键是LOCK前缀(LOCK_PREFIX)before dec(decl)操作.在x86上,LOCK前缀意味着原子性并且总是意味着完全的内存屏障.