【发布时间】:2015-02-11 13:36:32
【问题描述】:
我想快速将一个包含指针向量的对象传递给另一个进程。这就是我要发送的内容:
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++;
}
Edit2:一种廉价的解决方案:
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++;
}
【问题讨论】:
-
我添加了一个较小的版本
-
我已经更新了我的答案。由于缺少类型定义,无法真正进入演示。我知道你不能分享。希望这些链接对您有用
-
基本上我有一些东西可以创建所有这些对象,我希望其他进程可以单独使用这些对象,而不必重新初始化它们。据我所知,我有两条路径 - 套接字序列化/反序列化或共享内存。你认为这是一条明智的道路吗?
-
取决于使用模式。我认为
construct<>每个对象都可能会产生巨大的开销(参见例如bad_alloc is thrown)和How do I measure the size of a boost interprocess vector in shared memory?)。所以是的,对于许多小对象——你不想/不能让分配器感知——我建议序列化
标签: c++ boost shared-memory