【发布时间】:2017-08-28 22:58:46
【问题描述】:
我的问题是关于在单个写入进程和多个读取进程的上下文中使用 Boost.Interprocess 增长内存映射区域。 是否可以使用作者的managed_mapped_file::grow,假设读者不更新地图大小的变化是可以接受的?我的假设是读者的地图将保持有效,然后当我需要阅读器从作者那里获取最新更改时,我可以使用更新后的尺寸重新映射阅读器。这是正确的吗?
文档的Growing managed segments 部分说:
一旦创建了托管段,就不能再增加托管段了。这个限制不容易解决:每个附加到托管段的进程都需要停止,通知新的大小,它们需要重新映射托管段并继续工作。 [...]
这让我觉得我可以grow,只要我对不立即更新读者的情况感到满意。但是,文档继续说:
另一方面,Boost.Interprocess 提供离线段增长。这是什么意思?如果没有进程映射托管段,则该段可以增长。如果应用程序可以找到没有附加进程的时刻,它可以增长或缩小以适应托管段。 [...]
managed_mapped_file也提供了类似的功能来增加或shrink_to_fit托管文件。请记住,在执行增长/收缩过程时,不应有任何进程修改文件/共享内存。否则,托管段将被损坏。
这让我觉得我不能做我想做的事,但我不明白为什么它不起作用。
【问题讨论】:
-
您想谈谈更多关于段管理器与共享内存的烦恼吗?关于做出设计决策,我还有一些您可能想知道的警告:)
-
是的,我非常想知道这些警告。
-
Come over 如果你有时间
标签: c++ boost mmap memory-mapped-files boost-interprocess