【问题标题】:Shared memory Reader (read only) hangs when Writer terminates当 Writer 终止时,共享内存 Reader(只读)挂起
【发布时间】:2011-05-24 17:32:23
【问题描述】:

在 linux、C 中,使用共享内存,我有一个 Writer 进程和许多 Reader。

当 Writer 终止时,所有正在运行的 Reader 都会挂起。 Writer 在终止时会执行 shm_unlink。

我认为内核知道 Readers 并且他们可以继续阅读,这可能是错误的。当然数据不会改变,所以读者可以知道什么时候优雅地结束。

任何想法如何做到这一点?

【问题讨论】:

    标签: c memory shared writer


    【解决方案1】:

    您可以在共享内存中创建的标头中添加一个标志来指示 EOF。您可以定期更新时间戳以检测写入器不干净的终止/

    您还可以使用 shmctl 来找出关联的人数,这可能会帮助您确定作者是否已经离开。

    您也可以尝试重新附加/fstat 以验证该段没有被删除。

    如果这些答案不满足,请告诉我们是 POSIX 还是 System V 共享内存。

    【讨论】:

    • 作者现在在共享内存中为读者设置标志。这行得通但是,标志不好,即当读者挂起时。
    • @user768184:阅读器挂在什么系统调用上?通常它会轮询写手或类似的东西以获取更新。在轮询写手时,您可以轮询 EOF 标志或时间戳字段。
    • 我没有在 gdb 中运行它,所以不确定确切的调用。是的,阅读器定期阅读,通常为 25 毫秒。阅读器挂起后,这些标志就不好用了。系统是 POSIX,所以我猜 shm_、mmap 和 munmap 是我的工具。我认为 Reader 必须以某种方式知道 Writer 在尝试阅读之前执行了 shm_unlink。
    【解决方案2】:

    在 linux 中,内核不知道你的读者或作者(或者,好吧,它不知道哪个是哪个)。而shm_unlink 只是删除了名称;在所有用户取消映射并关闭或终止之前,它不会删除 shmem 段。如果您让这些读取器/写入器通过psharedmutexes/semaphores 进行通信和阻止,那么当写入器死亡时,您确实可能最终导致读取器挂起。最好让作者在队列中留下一条消息,告诉读者它正在终止。

    【讨论】:

      猜你喜欢
      • 2012-10-26
      • 2011-08-05
      • 1970-01-01
      • 2021-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-29
      相关资源
      最近更新 更多