将std :: set或std :: map与共享内存一起使用

时间:2014-02-05 09:34:02

标签: c++ process shared-memory stdmap stdset

我正在一个有两个不同流程的项目中工作。

  • 第一个进程是std :: map或std :: set上的缓存,它分配共享内存区域中的所有数据。
  • 第二个进程是一个生产者/消费者,它可以访问共享内存,因此每当它需要一些数据时,它将通过unix管道向缓存进程询问包含所请求数据的共享内存的起始地址。

到目前为止,我提出了两种方法,首先是将std :: set的分配函数更改为始终在共享内存中分配,或者更简单的方法是将映射的值存储为该共享的指针区域:

map<key, pointer to share region>

有什么想法吗? :D

谢谢!

1 个答案:

答案 0 :(得分:2)

理论上,您可以使用std::setstd::map的自定义分配器来执行此操作。当然,您必须确保可能动态分配的任何内容也使用相同的自定义分配器。

真正的问题是共享内存的映射地址可能不一样。通常可以通过使用mmap并指定地址来解决此问题,但两个进程中的地址范围必须是空闲的。我在Solaris下完成了这个,它总是在地址空间的底部分配(或分配)静态和堆,并在顶部堆叠,在中间留下一个大洞,但即使在那里,我也不认为是任何保证,其他系统有不同的政策。尽管如此,如果这些过程不是太大,您可以凭经验找到解决方案。 (我建议将地址和大小设置为配置参数。)

或者,理论上,分配器定义一个容器应该使用的指针类型;您应该能够定义一个指针类型,该指针类型仅适用于共享内存中的偏移量。但是,我没有这方面的经验,我担心它可能会非常棘手,因为引用类型仍然是一个真正的引用(因此引擎盖下的指针),你不能改变它。