是否可以将包含指针的向量放入共享托管内存中?
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++;
}
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++;
}
可以。
但是你必须确保指针也是从共享内存中分配的。
如果你出示 SSCCE,我会告诉你我会怎么做。
更新
在查看更新后的问题后,我必须说它会涉及到。您需要从共享内存分配 Shelve
s,并且对于现在从堆。
建议:
- 如果你真的只需要指针作为标识,不用担心
- 也许您可以只共享向量索引(以防它们在其他进程空间中有意义)
如果您使 类 分配器感知,您可以使用 boost::container::scoped_allocator_adaptor
来减轻一点痛苦。
我在以下答案中使用作用域分配器(来自 Boost)创建了演示:
- making non-shared copies of boost::interprocess shared memory objects
- want to efficiently overcome mismatch between key types in a map in Boost.Interprocess shared memory
[1](从技术上讲,至少是您从跨进程边界访问的部分)
我想快速将包含指针向量的对象传递给另一个进程。这就是我要发送的内容:
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++;
}
可以。
但是你必须确保指针也是从共享内存中分配的。
如果你出示 SSCCE,我会告诉你我会怎么做。
更新
在查看更新后的问题后,我必须说它会涉及到。您需要从共享内存分配 Shelve
s,并且对于现在从堆。
建议:
- 如果你真的只需要指针作为标识,不用担心
- 也许您可以只共享向量索引(以防它们在其他进程空间中有意义)
如果您使 类 分配器感知,您可以使用
boost::container::scoped_allocator_adaptor
来减轻一点痛苦。我在以下答案中使用作用域分配器(来自 Boost)创建了演示:
- making non-shared copies of boost::interprocess shared memory objects
- want to efficiently overcome mismatch between key types in a map in Boost.Interprocess shared memory
[1](从技术上讲,至少是您从跨进程边界访问的部分)