0

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

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

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

map<key, pointer to share region>

任何的想法?:D

谢谢!!

4

1 回答 1

2

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

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

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

于 2014-02-05T09:50:03.577 回答