semget:如何避免在创建/初始化时对信号量组进行并发访问?

时间:2016-11-03 15:51:14

标签: c perl unix ipc semaphore

当我用semget创建信号量组ID时(传递IPC_CREAT | IPC_EXCL标志) - 一般情况下,组内的信号量未初始化,可能包含“随机值”。

所以我需要在获取新创建的信号量组的id之后立即初始化所有信号量。

我的问题是:

如何避免semgrpID=semget(semgrpKey,nSemaphores,IPC_CREAT | IPC_EXCL);之间的潜在竞争条件 和 semctl(semgrpID,0,SETALL,...);

1 个答案:

答案 0 :(得分:2)

考虑使用POSIX信号量而不是SYSV信号量。 POSIX设计更简单,更清洁;例如,使用指定的初始值创建POSIX信号量。

但是,SYSV信号量具有POSIX信号量不具备的一些功能,例如可撤销操作和使用多元素信号量。如果你必须使用SYSV风味,那么......

我想你可以想象使用一个众所周知的信号量集密钥,这样你就无法控制指定创建信号量集的进程以外的进程访问集合的时间。在最坏的情况下,您可能有多个进程都尝试通过相同的密钥和IPC_CREAT | IPC_EXCL设置信号量集,其中一个成功负责初始化,另一个负责EEXIST尝试再没有那些旗帜。实际上,这确实会造成混乱。

如果您的情况是不相关的进程使用了​​众所周知的信号量集密钥,则关联的信号量集是系统资源,不属于任何单独的进程。在这种情况下,您应该有专门用于初始化和管理它的程序。这些应该连接到您的系统初始化框架。

还可以使用其他形式的互斥来保护信号量集的初始化。例如,您可以使用锁定文件。您甚至可以使用POSIX信号量来达到这个有限的目的。