我正在一个有两个不同过程的项目中工作 .
-
第一个进程是std :: map或std :: set上的缓存,它分配共享内存区域中的所有数据 .
-
第二个进程是一个 生产环境 者/消费者,它可以访问共享内存,所以每当它需要一些数据时,它会通过一个unix管道向缓存进程询问包含所请求数据的共享内存的起始地址 .
到目前为止,我提出了两种方法,首先是将std :: set的分配函数更改为始终在共享内存中分配,或者可以更方便地将映射的值存储为该共享区域的指针:
map<key, pointer to share region>
任何的想法? :d
谢谢!!
1 回答
理论上,您可以使用
std::set
或std::map
的自定义分配器来执行此操作 . 当然,您必须确保可能动态分配的任何内容也使用相同的自定义分配器 .真正的问题是共享内存的映射地址可能不一样 . 通常可以通过使用
mmap
并指定地址来解决此问题,但两个进程中的地址范围必须是空闲的 . 我认为有任何保证,其他系统有不同的政策 . 但是,如果进程不是't too big otherwise, you may be able to find a solution empirically. (I'建议将地址和大小设置为配置参数 . )或者,理论上,分配器定义一个容器应该使用的指针类型;你应该能够定义一个指针类型,它只与共享内存中的偏移量一起使用 . 然而,我没有这方面的经验,我担心它可能会非常棘手,因为引用类型仍然是一个真正的引用(因此引擎盖下的指针),你不能改变它 .