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前缀意味着原子性并且总是意味着完全的内存屏障.
归档时间: |
|
查看次数: |
730 次 |
最近记录: |