首页 文章

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

提问于
浏览
0

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

  • 第一个进程是std :: map或std :: set上的缓存,它分配共享内存区域中的所有数据 .

  • 第二个进程是一个 生产环境 者/消费者,它可以访问共享内存,所以每当它需要一些数据时,它会通过一个unix管道向缓存进程询问包含所请求数据的共享内存的起始地址 .

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

map<key, pointer to share region>

任何的想法? :d

谢谢!!

1 回答

  • 2

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

    真正的问题是共享内存的映射地址可能不一样 . 通常可以通过使用 mmap 并指定地址来解决此问题,但两个进程中的地址范围必须是空闲的 . 我认为有任何保证,其他系统有不同的政策 . 但是,如果进程不是't too big otherwise, you may be able to find a solution empirically. (I'建议将地址和大小设置为配置参数 . )

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

相关问题