我有一个在多个生产者和多个消费者之间共享的队列资源。所有都是独立的过程;没有一个进程“拥有”队列。
根据实现的性质,必须控制对队列的访问,并且在任何给定时刻只允许一个进程推送或弹出。
我认为使用POSIX命名信号量将是正确的解决方案,但是一些细节困扰着我。 (这是一个仅限Linux的实现,顺便说一句。)
什么时候(如果有的话)我应该做一个sem_unlink?有没有理由真正删除队列?
我担心在保持队列信号量被锁定的情况下进程死亡。这有什么好办法吗?我可以在尝试获取锁定时进行定时等待,但如果超时到期,我现在遇到了竞争条件。
这样的简单二进制锁是否有更好的解决方案?也许使用fcntl和/或exclusive的lockfile打开?
答案 0 :(得分:3)
文件锁具有在意外进程死亡时解锁的好处。我认为它们最适合你的情况。
我可以想象当我需要它们支持的更复杂的语义时使用信号量(它们不仅支持你想到的互斥量使用)但是如果我使用它们,我需要一些方法来在不合时宜的死亡中执行内务处理。我观察到Windows上的Lotus Notes有一个“ZapNotes”houskeeper,它整理了我认为类似的“不应该发生”的场景。