2009-08-30 63 views
4

我有一个在多个生产者和多个消费者之间共享的队列资源。所有都是独立的过程;没有一个进程“拥有”队列。多进程同步 - 比信号量更好的选择?

实现的性质必须控制对队列的访问,并且只有一个进程必须被允许在任何给定时刻推送或弹出。

我觉得使用POSIX命名的信号量是正确的解决方案,然而一些细节却困扰着我。 (这是一个Linux的实现,顺便说一句。)

  1. 当(如果有的话)我应该做一个sem_unlink吗?是否有任何理由实际删除队列?

  2. 我很担心在锁住队列信号的同时死亡的进程。有没有什么好办法解决这个问题?我可以在尝试获取锁定时进行定时等待,但如果超时过期,我现在已经有了竞争状态。

  3. 是否有像这样的简单二进制锁的更好的解决方案?也许一个使用fcntl和/或exclusive的锁定文件打开?

回答

3

文件锁具有在发生意外的进程死亡时解锁的好处。我认为他们最适合你的场景。

我可以想象使用信号量,当我需要它们支持的更复杂的语义(它们不仅仅支持你所想的互斥用法),但如果我确实使用它们,我需要一些方法来执行家务管理死亡。我注意到Windows上的Lotus Notes有一个“ZapNotes”houskeeper,它能够整理出我认为类似的“不应该发生”的情况。

+0

这些是基于服务的应用程序,所以“KillNotes”(我已经多次使用过!)在这里不起作用,但是感谢您的建议。 – Joe 2009-08-30 16:45:10

+0

建议实际上是使用文件锁定。 KillNotes等家务管理系统的必要性使我避开使用sempahores。 – djna 2009-08-30 17:23:03

+0

对不起,我了解你的意图,只是不清楚我的回应。 – Joe 2009-08-31 02:16:06