【发布时间】:2017-03-17 07:12:07
【问题描述】:
当我使用 semget 创建信号量组 id(传递 IPC_CREAT | IPC_EXCL 标志)时 - 一般情况下,我在组内的信号量未初始化并且可能包含“随机值”。
所以我需要在获得新创建的信号量组的 id 后立即初始化所有信号量。
我的问题是:
如何避免semgrpID=semget(semgrpKey,nSemaphores,IPC_CREAT | IPC_EXCL); 之间的潜在竞争条件
和
semctl(semgrpID,0,SETALL,...);
?
【问题讨论】:
-
创建信号量的进程需要在创建任何使用信号量的进程之前完成初始化。处理此问题的典型方法是创建/初始化信号量,然后分叉/执行其他进程。
-
访问这个信号量组的进程可以从 crond、CLI 开始,并且可以从 webserver 初始化。它不是从一个单一进程派生出来的。所以我需要保护信号量组本身,但为此我需要......信号量在某个地方?
-
然后作为启动序列的一部分,您需要运行一个程序来创建和初始化信号量组。它必须在任何使用信号量的程序被允许启动之前完成。
-
或者我可以在添加信号量组时使用flock,但我完全使用信号量组以避免使用任何flock。嗯...我希望,使用一个羊群而不是 10 个(已被信号量取代) - 是一个很好的折衷方案。
-
我想,我知道我的问题的答案。它是:“不要使用旧的 semget/semop/semctl”,而是使用 POSIX 信号量。 POSIX 的函数 sem_open 支持在一个原子操作中创建+初始化。