sem_post(sem_t*sem)和sem_wait(sem_t*sem)周围是否有完整的内存屏障?

hel*_*.co 4 c c++ linux

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

R..*_*R.. 11

权威答案在这里:

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

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

sem_wait并且sem_post在列表中,因此它们是完全的记忆障碍.


And*_*zos 1

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

  • 这个答案是特定于实现的,并没有给出它们是完全障碍的原因。 (2认同)
  • 即使对于 Linux,答案也将涉及它们是否被记录为这样,而不是实现(可能会改变)是否碰巧涉及障碍。 (2认同)