【发布时间】:2016-02-18 16:14:27
【问题描述】:
我正在阅读 this,其中 Robert Love 提到互斥锁是使用内存屏障实现的,但我看不到在互斥锁的 Linux implementation 中使用的内存屏障指令。
我想知道他是否指的是 posix 库中的互斥锁实现,它确实使用了内存屏障指令,因此它不会根据关键资源重新排序。我说的对吗?
【问题讨论】:
标签: linux linux-kernel posix mutex
我正在阅读 this,其中 Robert Love 提到互斥锁是使用内存屏障实现的,但我看不到在互斥锁的 Linux implementation 中使用的内存屏障指令。
我想知道他是否指的是 posix 库中的互斥锁实现,它确实使用了内存屏障指令,因此它不会根据关键资源重新排序。我说的对吗?
【问题讨论】:
标签: linux linux-kernel posix mutex
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 前缀表示原子性,并且总是表示完整的内存屏障。
【讨论】:
atomic_xchg,这意味着内存屏障。