我使用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中的偏移量 - 我该怎么做?
答案 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
就好了