【发布时间】:2011-05-24 17:32:23
【问题描述】:
在 linux、C 中,使用共享内存,我有一个 Writer 进程和许多 Reader。
当 Writer 终止时,所有正在运行的 Reader 都会挂起。 Writer 在终止时会执行 shm_unlink。
我认为内核知道 Readers 并且他们可以继续阅读,这可能是错误的。当然数据不会改变,所以读者可以知道什么时候优雅地结束。
任何想法如何做到这一点?
【问题讨论】:
在 linux、C 中,使用共享内存,我有一个 Writer 进程和许多 Reader。
当 Writer 终止时,所有正在运行的 Reader 都会挂起。 Writer 在终止时会执行 shm_unlink。
我认为内核知道 Readers 并且他们可以继续阅读,这可能是错误的。当然数据不会改变,所以读者可以知道什么时候优雅地结束。
任何想法如何做到这一点?
【问题讨论】:
您可以在共享内存中创建的标头中添加一个标志来指示 EOF。您可以定期更新时间戳以检测写入器不干净的终止/
您还可以使用 shmctl 来找出关联的人数,这可能会帮助您确定作者是否已经离开。
您也可以尝试重新附加/fstat 以验证该段没有被删除。
如果这些答案不满足,请告诉我们是 POSIX 还是 System V 共享内存。
【讨论】:
在 linux 中,内核不知道你的读者或作者(或者,好吧,它不知道哪个是哪个)。而shm_unlink 只是删除了名称;在所有用户取消映射并关闭或终止之前,它不会删除 shmem 段。如果您让这些读取器/写入器通过psharedmutexes/semaphores 进行通信和阻止,那么当写入器死亡时,您确实可能最终导致读取器挂起。最好让作者在队列中留下一条消息,告诉读者它正在终止。
【讨论】: