【发布时间】:2012-09-18 17:56:28
【问题描述】:
由于我工作的政策,我无法使用高于 1.33.1 的 Boost 版本,也无法使用高于 4.1.2 的 GCC 版本。是的,这是垃圾,但我对此无能为力。 Boost 1.33.1 不包含进程间库。
也就是说,我的一个项目需要将std::map(或更可能是std::unordered_map)放入共享内存。当进程由单个进程(“服务器”)加载并由许多其他进程读取时,它只被写入/修改一次。我以前没有做过共享内存 IPC,所以这对我来说是一个相当新的领域。我查看了shmget(),但似乎我不能持续使用相同的共享内存键进行分配(我认为 STL 容器分配器需要)。
还有其他使用共享内存的NON-BOOST STL 分配器吗?
编辑:这已经做过了。 Dr. Dobbs had an article on how to do this exactly back in 2003,我开始用它作为参考。但是,代码列表不完整,指向它们的链接会重定向到主站点。
编辑编辑:我不只是重写 Boost.Interprocess 的唯一原因是因为涉及的代码量。我只是想知道是否有专门针对 POSIX 共享内存的相对简短和简洁的东西,我可以从头开始重写,因为网络之间的数据传输也需要经过多天的审批流程......
【问题讨论】:
-
哎哟。听起来你在自找麻烦,我不会在共享内存中放置
std::map,提升或不提升。你确定这是解决这个问题的最好方法吗?也许是更干净的消息传递解决方案? -
好吧,我不确定。我正在转换的软件最初是用 Python 编写的,并使用多处理库将字典存储在共享内存中。我尝试查看库的 C 实现,但无法弄清楚字典代理实际上是如何使用共享内存的,但这很大程度上与组织不善和我放弃搜索有关。还应注意,此映射是一次写入的只读结构。它从配置文件加载默认值并将它们存储在内存中,直到进程重新启动。之后没有对值进行任何更改。
-
您对这张地图的天花板尺寸有合理的期望吗? (即元素数量和其中占用的空间?)
-
所以你不能使用最新的 Boost 版本,但只要它包含所需的功能,就可以使用任何随机的开源库?我在这里闻到了老鼠的味道……无论如何。包含指针的对象不能放在共享内存中。您需要相对内存偏移量。 Boost IPC lib 不允许您将
std::map放在共享内存中(什么都不会),它提供了自己的map版本。您需要创建自己的。由于您的数据结构是 WORM,因此您可以只使用排序数组。没有指针。 -
@n.m.我不能只使用任何开源库。我们受到this document 的限制。而且我知道不能使用指针。这就是我想要一个 STL 分配器的原因,所以如果需要,我也可以将它用于字符串。至于无法将 STL 容器放在共享内存中,Dr. Dobbs did it in 2003 但它们的存档代码列表不完整。
标签: c++ ipc shared-memory allocator