我正在阅读this,其中Robert Love提到互斥是使用内存屏障实现的,但我无法看到Linux implementation互斥锁中使用的内存屏障指令。
我想知道他是否指的是posix库中的互斥锁实现,它确实使用了内存屏障指令,因此它不会对关键资源进行重新排序。我是对的吗?
答案 0 :(得分:10)
Robert Love的回答适用于任何区域的互斥锁。
您引用的linux内核中的实现使用__mutex_fastpath_lock
,它执行大部分工作并且通常使用汇编代码实现。例如,在x86_64上,implementation可以是:
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 }
这里的关键是dec
(decl
)操作之前的LOCK前缀(LOCK_PREFIX)。在x86上,LOCK前缀表示原子性,并且始终表示完全内存屏障。
答案 1 :(得分:0)