多进程同步——比信号量更好的选择?

Joe*_*Joe 5 linux posix semaphore locking

我有一个在多个生产者和多个消费者之间共享的队列资源。都是独立的进程;没有一个进程“拥有”该队列。

根据实现的本质,必须控制对队列的访问,并且在任何给定时刻都必须只允许一个进程压入或弹出。

我认为使用 POSIX 命名的信号量将是正确的解决方案,但是一些细节让我困扰。(顺便说一句,这是一个仅限 Linux 的实现。)

  1. 我什么时候(如果有的话)应该执行 sem_unlink?有什么理由实际删除队列吗?

  2. 我担心在保持队列信号量锁定时进程会死亡。有什么好的办法解决这个问题吗?当尝试获取锁时,我可以进行定时等待,但如果超时到期,我现在就会遇到竞争条件。

  3. 对于像这样的简单的二元锁有更好的解决方案吗?也许使用 fcntl 和/或独占打开锁定文件?

djn*_*jna 3

文件锁的优点是在进程意外死亡时可以解锁。我认为它们最适合您的场景。

我可以想象当我需要它们支持的更复杂的语义时使用信号量(它们不仅仅支持您想到的互斥体用法),但如果我确实使用它们,我需要某种方法在过早死亡的情况下执行内务处理。我观察到 Windows 上的 Lotus Notes 有一个“ZapNotes”管家,可以在我认为类似的“不应该发生”的情况下进行整理。