我正在尝试在以下类型的共享内存中构建映射
我像这样创建共享内存区域:
managed_shared_memory segment(create_only ,"MyMap" ,size);
ShMemAllocator_t alloc_inst (segment.get_segment_manager());
map = segment.construct<MyMap_t>("MyMap")
(std::less<int>()
,alloc_inst);
Map 中的值如下:
typedef pair<MutexType, boost::interprocess::offset_ptr<void> > ValueType ;
MutexType本身是一个包含read和write mutex的结构(使用read_lock和write_lock);定义如下:
typedef struct mutex_struct{
sharable_lock<interprocess_mutex> read_lock(interprocess_mutex, defer_lock);
scoped_lock<interprocess_mutex> write_lock(interprocess_mutex, defer_lock);
} MutexType;
“size”是映射的总大小(就对象而言,所有void指针指向的数据大小的总和) .
如何确保此void *数据也位于我创建的此内存段中,如何在现有共享内存区域中实例化它 . 这样做的原因是我想只分配一次这个大缓冲区,但是反复删除/添加对象( Map 模拟缓存)我还没有找到一种方法,可以在同一个内存段中分配多个对象在 Map 内 . 此外,寻求分配MutexType对返回编译错误,指出没有提供“call”操作符 .
2 回答
你基本上已经在那里了 . 调用您在共享内存中分配的任何对象类型
SecondValue_t
. 而不是ShMemAllocator_t
,定义一个不同的进程间分配器类型,比如SecondValueAllocator_t
,用于分配SecondValue_t
对象 . 每当要将ValueType
对象插入到映射中时,ValueType
对象的第二个值将与SecondValueAllocator_t
实例一起分配 .这是一个完整的示例,部分使用my answer中的代码Interprocess reader/writer lock with Boost:
首先通过启动父进程来测试它:
然后一些孩子:
样本输出:
您可以在allocator <>中使用rebind
做一个
然后像这样分配你的记忆
默认的std :: allocator <>是state less . 共享内存分配器将具有状态,因此您需要弄清楚如何在不同类型的分配器之间复制状态 .