为了在多个进程中使用未命名的 POSIX 信号量,必须创建/获取对共享内存一部分的访问权限。之后,一个进程必须通过sem_init
将对共享内存的引用作为第一个参数进行调用来初始化信号量。但是,此操作只允许进行一次!
POSIX说:
尝试初始化已初始化的信号量会导致未定义的行为。
问题在于,无法以原子方式测试信号量是否已存在并已初始化,以及如果不存在则对其进行初始化。
人们可能会想简单地向共享内存添加一个布尔标志,以指示信号量是否已初始化,但这显然会产生竞争条件 - 在使用信号量时,这是人们绝对不希望看到的:)
XSI(又名 System V)信号量需要一些相当复杂的方式来正确初始化而无需竞争,但可以使其安全(例如,参见 APUE 中的实现)。此外,命名 POSIX 信号量也不会显示此问题,因为它sem_open
接受O_EXCL
标志并且也可以初始化信号量的值。
那么,如何在进程之间安全地共享未命名的 POSIX 信号量,而不依赖于其他方法来同步或仅在初始化信号量后分叉其他进程呢?我想念什么?