我正在一个有两个不同流程的项目中工作。
到目前为止,我提出了两种方法,首先是将std :: set的分配函数更改为始终在共享内存中分配,或者更简单的方法是将映射的值存储为该共享的指针区域:
map<key, pointer to share region>
有什么想法吗? :D
谢谢!
答案 0 :(得分:2)
理论上,您可以使用std::set
或std::map
的自定义分配器来执行此操作。当然,您必须确保可能动态分配的任何内容也使用相同的自定义分配器。
真正的问题是共享内存的映射地址可能不一样。通常可以通过使用mmap
并指定地址来解决此问题,但两个进程中的地址范围必须是空闲的。我在Solaris下完成了这个,它总是在地址空间的底部分配(或分配)静态和堆,并在顶部堆叠,在中间留下一个大洞,但即使在那里,我也不认为是任何保证,其他系统有不同的政策。尽管如此,如果这些过程不是太大,您可以凭经验找到解决方案。 (我建议将地址和大小设置为配置参数。)
或者,理论上,分配器定义一个容器应该使用的指针类型;您应该能够定义一个指针类型,该指针类型仅适用于共享内存中的偏移量。但是,我没有这方面的经验,我担心它可能会非常棘手,因为引用类型仍然是一个真正的引用(因此引擎盖下的指针),你不能改变它。