在sem_post(sem_t * sem)和sem_wait(sem_t * sem)之间是否存在完整的内存屏障?

Is there a full memory barrier around sem_post(sem_t * sem) and sem_wait(sem_t * sem)?

本文关键字:sem 内存 wait post 之间 是否 存在      更新时间:2023-10-16

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

权威答案在这里:

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

应用程序应确保多个控制线程(线程或进程)对任何内存位置的访问受到限制,这样当另一个控制线程可能正在修改内存位置时,任何控制线程都不能读取或修改内存位置。使用同步线程执行和同步相对于其他线程的内存的函数来限制这种访问。以下函数与其他线程同步内存:…

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

是的,它在无争用的情况下使用原子自增/自减,这当然有一个成员栏。对于争用的情况,有一个对futex的系统调用,它也有一个成员条。