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

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

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

权威的答案在这里:

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

应用程序应确保由多个控制线程(线程或进程)对任何内存位置的访问受到限制,使得在另一个控制线程可能正在修改它时,没有任何控制线程可以读取或修改内存位置。 这种访问是使用同步线程执行的函数来限制的,并且也相对于其他线程同步内存。 以下功能相对于其他线程同步内存:…

sem_waitsem_post在列表中,所以它们是完整的内存障碍。