如何同步未命名 POSIX 信号量的初始化?

如何同步未命名 POSIX 信号量的初始化?

为了在多个进程中使用未命名的 POSIX 信号量,必须创建/获取对共享内存一部分的访问权限。之后,一个进程必须通过sem_init将对共享内存的引用作为第一个参数进行调用来初始化信号量。但是,此操作只允许进行一次!

POSIX说:

尝试初始化已初始化的信号量会导致未定义的行为。

问题在于,无法以原子方式测试信号量是否已存在并已初始化,以及如果不存在则对其进行初始化。

人们可能会想简单地向共享内存添加一个布尔标志,以指示信号量是否已初始化,但这显然会产生竞争条件 - 在使用信号量时,这是人们绝对不希望看到的:)

XSI(又名 System V)信号量需要一些相当复杂的方式来正确初始化而无需竞争,但可以使其安全(例如,参见 APUE 中的实现)。此外,命名 POSIX 信号量也不会显示此问题,因为它sem_open接受O_EXCL标志并且也可以初始化信号量的值。

那么,如何在进程之间安全地共享未命名的 POSIX 信号量,而不依赖于其他方法来同步或仅在初始化信号量后分叉其他进程呢?我想念什么?

相关内容