【问题标题】:Is linux' "mutex lock" implemented using "memory barrier"?linux 的“互斥锁”是使用“内存屏障”实现的吗?
【发布时间】:2016-02-18 16:14:27
【问题描述】:

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

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

【问题讨论】:

    标签: linux linux-kernel posix mutex


    【解决方案1】:

    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 前缀表示原子性,并且总是表示完整的内存屏障

    【讨论】:

    【解决方案2】:

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

    顺便说一句,GNU libcmusl-libc 都是 POSIX 线程的 free software 实现。所以研究他们的源代码如果你想了解细节。

    【讨论】:

      猜你喜欢
      • 2014-09-11
      • 2015-04-28
      • 1970-01-01
      • 1970-01-01
      • 2013-12-07
      • 1970-01-01
      • 2010-12-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多