由于我工作的政策,我无法使用比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共享内存的内容我可以从头开始重写,因为网络之间的数据传输也需要经过多天的审批过程......
答案 0 :(得分:6)
指针在共享内存中不起作用,除非您无法在固定地址处固定共享内存(在所有进程中都一致)。因此,您需要特定的类,这些类要么是连续的(没有指针),要么有一个偏移量(而不是指针)进入共享内存映射的内存区域。
我们在非常类似的情况下使用共享内存:一个进程计算一组数据,将其放在共享内存中,然后发出信号通知其他进程可以将内存映射到自己的地址空间;之后记忆永远不会改变。
我们采用的方法是使用 POD 结构(*)(一些包括char xxx[N];
字符串存储属性)。如果你能真正限制你的琴弦,你就是金色的。就map
而言:对于只读存储来说效率很低=>排序数组执行得更好(对内存位置的欢呼)。所以我建议去吧:
struct Key {
enum { Size = 318 };
char value[Size];
};
struct Value {
enum { Size = 412 };
enum K { Int, Long, String };
K kind;
union { int i; long l; char string[Size]; } value;
};
然后只需要排序std::pair<Key, Value>
的数组(std::sort
),然后使用std::lower_bound
进行搜索。您需要为密钥编写比较运算符,显然:
bool operator<(Key const& left, Key const& right) {
return memcmp(left.value, right.value, Key::Size) < 0;
}
并且我同意enum + union技巧不像增强变体那样具有吸引力(界面明智)......你可以更好地使界面更好。
(*)实际上,不需要纯POD。例如,拥有私有属性,构造函数和复制构造函数是完全可以的。所需要的只是避免间接(指针)。
答案 1 :(得分:0)
简单的解决方法。从Boost 1.51创建你自己的“libNotBoost v1.0”.Boost库允许这样做。因为它不再是Boost,你没事。