**非升压** STL分配器用于共享存储器(**Non-Boost** STL allocator

2019-07-31 23:21发布

由于政策,我的工作,我无法使用的版本比升压和1.33.1无法使用GCC版本的更新比4.1.2更新的。 是的,这是垃圾,但没有什么我可以做些什么。 升压1.33.1不包含间图书馆。

这就是说,我的一个项目需要放置std::map (或者更可能的std::unordered_map )在共享内存。 它仅写入/修改的ONE TIME当由许多其它进程读取由单个处理过程的负载(“服务器”)和。 我没有做过共享内存IPC之前,所以这对我来说是相当新的领域。 我看了看shmget()但它会出现,我不能继续使用分配相同的共享内存键(因为我认为就需要用STL容器分配器)。

是否有使用共享内存的任何其他非升压 STL分配器?

编辑:这之前已经完成。 布斯博士对如何做到这一点正是早在2003年的一篇文章 ,我开始使用它作为参考。 然而,代码清单不完整和链接重定向到主站点。

编辑编辑:唯一的原因,我不只是重新写Boost.Interprocess中是因为代码涉及的金额。 我只是想知道是否有一些比较简短的专门针对POSIX共享内存,我能重新从头开始写,因为网络之间的数据传输也受到了多天的审批流程...

Answer 1:

指针不共享内存中工作,除非你不能在一个固定的地址(在所有进程相一致)拖住共享内存。 这样,就需要特定的类,要么是连续的(没有指针),或具有偏移(而不是指针)成其中所述共享存储器被映射到的存储器区域。

我们在工作时间使用共享内存在一个非常类似的情况:一个进程计算的一组数据,并将其放置在共享内存中,然后发出信号,他们可以将内存映射到自己的地址空间中的其他进程; 记忆是永远不会改变之后。

我们去它的方式是具有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;
}

我同意枚举+联盟伎俩是那么吸引人(接口方面)比升压变...这是你来使界面更好。

(*)其实,一个纯粹的POD是没有必要的。 这是完全没关系有私有属性,构造函数和拷贝构造函数的例子。 所有需要的是避免间接(指针)。



Answer 2:

简单的解决方法。 创建自己的“libNotBoost与Boost 1.51 v1.0`。Boost库允许这样做。因为它不再提升,你的罚款。



文章来源: **Non-Boost** STL allocator for shared memory