是否可以将包含指针的矢量放入共享托管内存中
Is it Possible to Place Vectors Containing Pointers into Shared Managed Memory?
我想快速将一个包含指针向量的对象传递给另一个进程。这就是我想要发送的:
typedef std::vector<Shelve*> ShelveVec;
这就是我尝试过的:
managed_shared_memory segment{create_only, "HwDescriptionObjects", 1056};
BeBoardInterface *sBeBoardInterface = segment.construct<BeBoardInterface>("BeBoardInterface")(fBeBoardFWMap);
CbcInterface *sCbcInterface = segment.construct<CbcInterface>("CbcInterface")(fBeBoardFWMap);
ShelveVec *sShelveVector = segment.construct<ShelveVec>("ShelveVector")(fShelveVector, alloc_inst);
qDebug() << "Size " << sShelveVector->size();
前两个共享内存对象可以工作,但我已经尝试过矢量,我从阅读BOOST文档中了解到,由于begin
指针分配等问题,矢量的实现有点棘手。当从进程访问时,它最终是空的。
这有可能吗?
编辑,尽我所能提供的信息:
我做了一系列循环来初始化这些类:
uint32_t cNShelve = 0
for(auto &kv : mapSettings.keys())
{
cShelveId=kv;
fShelveVector.push_back(new Shelve(cShelveId));
for(auto &kv_ : mapSettings.value(kv).keys()):
{
cBeId = kv_;
BeBoard* cBeBoard = new BeBoard(cShelveId, cBeId);
fShelveVector.at(cNShelve)->addBoard(cBeBoard);
}
cNShelve++;
}
第2版:廉价的解决方案:
managed_shared_memory segment{create_only, "HwDescriptionObjects", 1056};
uint32_t cNShelve = 0
for(auto &kv : mapSettings.keys())
{
cShelveId=kv;
Shelve *sShelve = segment.construct<Shelve>("Shelve")(cShelveId)
fShelveVector->push_back(sShelve);
for(auto &kv_ : mapSettings.value(kv).keys()):
{
cBeId = kv_;
BeBoard* cBeBoard = segment.construct<BeBoard>("BeBoard")(cShelveId, cBeId);
fShelveVector.at(cNShelve)->addBoard(cBeBoard);
}
cNShelve++;
}
HwDescription对象的内容
您可以。
但是,您必须确保指针也是从共享内存中分配的。
如果你展示SSCCE,我会向你展示我该怎么做。
更新
在看了更新后的问题后,我必须说它会被卷入其中。您需要从共享内存中分配Shelve
,对于现在从堆中分配的所有内部[1](如BeBoards
)也是如此。
建议:
- 如果你真的只需要指针作为标识,不要担心
- 也许您可以只共享向量索引(以防它们在其他流程空间中有意义)
-
如果您让类分配器知道,您可以使用
boost::container::scoped_allocator_adaptor
来稍微减轻一些痛苦。我使用作用域分配器(来自Boost)创建了演示,答案如下:
- 同时使用共享内存的多个实例
- 制作boost:的非共享副本:进程间共享内存对象
- 想要有效地克服Boost中映射中键类型之间的不匹配。进程间共享内存
- https://stackoverflow.com/a/26855444/85371
[1](从技术上讲,至少是您从跨流程边界访问的零件)
相关文章:
- 使用Boost Interprocess创建托管共享内存需要很长时间
- 字符串共享内存映射的向量
- CUDA 使用共享内存平铺 3D 卷积实现
- 共享内存:MapViewOfFile 返回错误 5
- 如何在多写入器情况下对文件支持的共享内存中的大页面出错
- 有没有办法列出所有共享内存对象的名称?
- 共享内存的升压容器是否实现锁定?
- 共享内存中的健壮互斥锁不是那么健壮
- 使用IPC/共享内存将Integer数组从C++传递到Python
- 共享内存和性能
- 在这种特殊情况下,我是否需要在共享内存中使用原子类型
- 是否可以在专用内存空间中分配一个为提升管理共享内存而创建的对象
- fork(),在C中共享内存和指针
- 访问共享内存而不使用易失性、std::atomic、信号量、互斥锁和自旋锁
- 提升进程间共享内存open_or_create每次都会引发异常
- 通过 mmap-ed 共享内存传递可变长度 C 字符串
- 越界访问 CUDA 共享内存
- 在共享内存中插入映射映射时出现编译器错误
- 矩阵矢量产品 CUDA 通过平铺和共享内存提高性能
- 如何更改在 c++ 中使用提升库创建的共享内存的路径