4

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

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

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

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

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

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

4

1 回答 1

3

文件锁具有在进程意外死亡的情况下解锁的好处。我认为它们最适合您的情况。

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

于 2009-08-30T16:22:57.043 回答