【问题标题】:Shared Memory Semaphore共享内存信号量
【发布时间】:2010-11-27 10:22:33
【问题描述】:

我有 10 个进程正在运行,每个进程都写入同一个文件。我不想要多个作家,所以基本上我正在寻找一个互斥/二进制信号量来保护文件写入。问题是我不能在 10 个进程之间共享信号量,所以我正在研究在 10 个进程之间使用共享内存,并将信号量放在共享内存中,以便每个进程都可以访问它。

谁能指出我在 C/C++ for Unix 中的相关文档?使用这种结构的示例代码会很棒。

谢谢

【问题讨论】:

  • @rsinha 为什么不能在进程之间使用信号量? AFAIK 进程只需要知道信号量标识符就可以处理它

标签: c++ c unix concurrency shared-memory


【解决方案1】:

您可以使用 PTHREAD 互斥锁。在初始化互斥锁时,您需要使用pthread_mutexattr_setpshared 函数使互斥锁跨进程共享,然后将其放入共享内存中。所有进程都可以附加到共享内存,然后访问互斥体。

您还可以根据您的锁定要求(递归等)向 SHM 添加其他属性

【讨论】:

    【解决方案2】:

    将信号量放在共享内存中并不是解决这个问题的最佳方法(如果它甚至可以工作的话)。您应该研究一下文件锁定,这是一项 UNIX 功能,专门用于在文件编写者之间提供排他性。

    具体请查看:

    更多解释材料,见Advanced Programming in the UNIX Environment, section 14.3

    【讨论】:

      【解决方案3】:

      听起来你最好使用flock(2)

      flock(fd, LOCK_EX);
      n = write(fd, buf, count);
      flock(fd, LOCK_UN);
      

      【讨论】:

        【解决方案4】:

        看看 W. Richard Stevens 的 UNIX Network Programming Vol. 2

        这是一本关于这个主题的最好的书。

        【讨论】:

          【解决方案5】:

          如何使用 UNIX IPC 创建共享队列。一个进程读取队列并写入文件,所有其他进程将数据推入队列。

          【讨论】: