是linux' "互斥锁"使用"记忆障碍"?

时间:2015-11-17 10:20:51

标签: linux linux-kernel posix mutex

我正在阅读this,其中Robert Love提到互斥是使用内存屏障实现的,但我无法看到Linux implementation互斥锁中使用的内存屏障指令。

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

2 个答案:

答案 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 }

这里的关键是decdecl)操作之前的LOCK前缀(LOCK_PREFIX)。在x86上,LOCK前缀表示原子性,并且始终表示完全内存屏障

答案 1 :(得分:0)

实际上,互斥锁需要一些内存同步。重要的是如何在没有繁忙的自旋锁的情况下等待互斥锁(通过其他线程解锁)(特别是因为您不希望等待线程占用大量CPU)。阅读futex(7)。与clone(2)类似,futex(2)系统调用仅对线程库的实现者有用。

< BTW,GNU libc& musl-libc是POSIX线程的free software实现。如果您想了解详细信息,请研究他们的源代码