【问题标题】:Is there a full memory barrier around sem_post(sem_t * sem) and sem_wait(sem_t * sem)?sem_post(sem_t * sem) 和 sem_wait(sem_t * sem) 周围是否存在完整的内存屏障?
【发布时间】:2013-05-08 02:24:44
【问题描述】:

在 linux 代码中, 我记得听说 mutex_lock() 周围有一个完整的内存屏障。 我想确定它是否也在 sem_xxx 附近。

【问题讨论】:

  • 好吧,因为它们是相互实现的,是的。
  • @JesusRamos:互斥量和信号量没有相互实现。两者都是分开实现的。然而,它们都使用原子增量/减量和 futex。
  • 我写错了,我的意思是用同样的东西。
  • 相关:How does a mutex lock and unlock functions prevents CPU reordering? 描述了如何防止编译时重新排序。

标签: c++ c linux


【解决方案1】:

权威答案在这里:

http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap04.html#tag_04_11

应用程序应确保多个控制线程(线程或进程)对任何内存位置的访问受到限制,这样任何控制线程都无法读取或修改内存位置,而另一个控制线程可能正在修改它。使用同步线程执行以及相对于其他线程同步内存的函数来限制此类访问。以下函数相对于其他线程同步内存: ...

sem_waitsem_post 在列表中,因此它们是完整的内存屏障。

【讨论】:

    【解决方案2】:

    是的,它在无竞争的情况下使用原子增量/减量,这当然有一个 membar。对于有争议的情况,有一个对 futex 的系统调用,它也有一个 membar。

    【讨论】:

    • 这个答案是特定于实现的,并没有说明它们是完全障碍的原因。
    • @R.:问题标记为linux,并以“在 linux 代码中”开头。他没有问为什么,他只是问他们有没有。
    • 即使对于 Linux,答案也将涉及它们是否被记录为此类,而不是实现(可能会改变)是否碰巧涉及障碍。
    • @R.:在这种情况下做一个愚蠢的区分。我什至不确定如何在没有 membar 的情况下实现信号量或互斥量。
    • 确实,由于 x86 具有非常强大的内存排序,因此几乎不可能在执行流程同步时安排内存不同步,如果有任何原子(锁定前缀)指令,则可能完全不可能参与其中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    • 2011-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-23
    • 2017-08-02
    相关资源
    最近更新 更多