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

时间:2013-05-08 02:24:45

标签: c++ c linux

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

2 个答案:

答案 0 :(得分:10)

权威的答案在这里:

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

  

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

sem_waitsem_post位于列表中,因此它们是完整的内存障碍。

答案 1 :(得分:1)

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