提升共享内存 - 返回指针向量

时间:2015-01-22 18:51:32

标签: c++ boost shared-memory

我使用boost :: interprocess :: mapped_region来保存我在不同进程之间共享的固定数组structs。这工作正常,我通过ID偏移访问这些结构。

E.g。

Container_Struct* container = (Container_Struct*)mapped_region.get_address()

其中Container_Struct包含另一个我可以通过偏移量访问的结构数组。

E.g。

MyData* data = container->dataArray[0];

我知道这不是处理共享数据的最优雅方式,但我只是一个使用提升进程和使用地图等的初学者。对我来说并不是很清楚。

现在我要做的是将指向许多MyData结构的指针的列表/向量返回给不同的进程。

我显然不能简单地使用std::vector<MyData*>容器,因为向量是临时的并且在进程中无效。

我如何创建指向MyData struct的临时指针向量?我不能简单地创建另一个区域来保存向量,因为如果多个进程请求指针向量,这将不是线程安全的 - 我也不想要锁定读取的任何开销,因为当前共享的数据是只读和从不写任何进程 - 因此不需要同步/锁定。

假设我想在我的共享库中添加一个函数,该函数将根据索引MyData*的列表为我提供int指针的向量,其中index是Container_Struct中的偏移量 - 我该怎么做?

1 个答案:

答案 0 :(得分:0)

您使用向量boost::interprocess::offset_ptr来共享内存段内的指针,使得指针可以跨进程使用,例如:

template <typename T>
using Ptr = boost::interprocess::offset_ptr<T>;

template <typename T>
using SharedVector = std::vector<
      Ptr<T>,
      boost::interprocess::allocator<Ptr<T>, boost::interprocess::shared_memory_segment::segment_manager>;

当然,您需要让实际的T指向同一内存段,offset_ptr能够正常工作。

现在看来,你实际上更善于使用

  • boost :: multi_index_container(可以对容器进行主(多)索引)并且理解Boost进程间分配器就好了

  • 提升侵入式容器(可以形成一组&#34;简单&#34;生活的对象&#34;其他地方&#34;)。内置的Intrusive Hooks了解如何使用boost::interprocess::offset_ptr就好了