Linux的“互斥锁”是用“内存屏障”实现的吗?

o8x7eapl  于 2024-01-06  发布在  Linux
关注(0)|答案(3)|浏览(176)

我正在阅读this,其中Robert Love提到互斥是使用内存屏障实现的,但我无法看到Linux实现互斥锁时使用的内存屏障指令。
我想知道他是否指的是posix库中的互斥锁实现,它确实使用了内存屏障指令,这样它就不会相对于关键资源重新排序,我说的对吗?

s2j5cfk0

s2j5cfk01#

Robert Love的答案适用于 * 任何领域 * 的互斥。
你提到的Linux内核中的实现使用__mutex_fastpath_lock,它完成了大部分工作,通常使用汇编代码实现。例如,在x86_64上,它的实现可以是:

  1. 20 static inline void __mutex_fastpath_lock(atomic_t *v,
  2. 21 void (*fail_fn)(atomic_t *))
  3. 22 {
  4. 23 asm_volatile_goto(LOCK_PREFIX " decl %0\n"
  5. 24 " jns %l[exit]\n"
  6. 25 : : "m" (v->counter)
  7. 26 : "memory", "cc"
  8. 27 : exit);
  9. 28 fail_fn(v);
  10. 29 exit:
  11. 30 return;
  12. 31 }

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

展开查看全部
mhd8tkvw

mhd8tkvw2#

实际上,互斥锁需要一些内存同步。重要的是如何在没有忙碌自旋锁的情况下等待互斥锁被解锁(由其他线程解锁)(特别是,因为您不希望等待线程占用大量CPU)。阅读futex(7)。与clone(2)一样,futex(2)系统调用仅对线程库的 * 实现者 * 有用。
顺便说一句,GNU libcmusl-libc都是POSIX线程的free software实现。如果你想了解细节,请研究它们的源代码。

z9gpfhce

z9gpfhce3#

这个答案有两个问题:(1)它是特定于x86的,(2)它已经过时了(这将是Linux内核中的常见情况,特别是在八年之后)。
当前代码如下:
这保证只提供获取语义,而不是一个完整的屏障。是的,这确实在x86上提供了一个完整的屏障,但这是一个实现的意外。这个完整的屏障绝对不能在所有架构中得到保证。

相关问题