从 Boost InterProcess Shared Memory 中检索共享向量
Posted
技术标签:
【中文标题】从 Boost InterProcess Shared Memory 中检索共享向量【英文标题】:Retrieving shared vectors from Boost InterProcess Shared Memory 【发布时间】:2014-02-06 09:33:27 【问题描述】:我创建了一个 Boost Shared 内存,用于共享向量。
分享已完成。
但是,我不明白向量是如何被推入共享内存的。
我在写入过程中对共享内存执行push_back
。所以向量像堆栈push
一样被推入共享内存,按照 LIFO 顺序?
另一个应用程序,阅读器,以下列方式检索向量:
managed_shared_nmemory segment (open_only, "Shared_mem_name");
Vector = segment.find<VECTOR_TYPE>("Vector_name").first;
if (Vector != NULL)
//CODDE
现在在这里,我正在阅读哪个矢量。最后推入的(最新的)?如果我正在阅读它,是否意味着向量被弹出?即读取后它是否仍然存在于共享内存中,如果是这样,一段时间后共享内存是否会溢出,我将如何阻止它?我在文档中没有看到任何关于它的内容...
【问题讨论】:
检查您是否有正确的进程同步并且正在使用VECTOR_TYPE
中的IPC 分配器。我建议您从文档中的示例开始。
【参考方案1】:
向量不会“推送”到共享内存中。没有隐式堆栈。
相反,向量存在在共享内存中。您正在阅读的内容实际上与另一个进程中的向量完全相同,同时。
请注意,这强烈暗示您也需要一个共享互斥锁来同步访问,否则您将在线程之间(来自不同进程)发生数据竞争,根据定义,这是 C++ 中的Undefined Behaviour。
换个角度:
我在写入过程中对共享内存执行
push_back
。所以向量被像堆栈推送一样被推送到共享内存中,按照 LIFO 顺序?
分解:
我对共享内存做了一个
push_back
不,你没有。您将push
一个向量元素转换为一个向量的back
。此向量是您共享的唯一内容,名称为 "Vector_name"
所以向量正在被推送
不,您的向量保持原样:在共享内存中。
就像以 LIFO 顺序将堆栈推入共享内存?
不,只有 1 个向量。向量本身就是一个有序的顺序容器。它支持随机访问,所以
for (auto it = v.begin(); it!= v.end(); ++it)
// process `*it` in order
对
for (auto it = v.rbegin(); it!= v.rend(); ++it)
// process `*it` in reversed order
如果你一直使用push_back
进行插入,那么in order
迭代就像“先进先出”
【讨论】:
那么,在这种情况下,如果我阅读记录Vector = segment.find<VECTOR_TYPE>("Vector_name").first;
,我实际上是在阅读记录在上面的第一条记录?共享内存被填满时的行为是什么?它会从头开始覆盖吗?
没有。和往常一样,如果分配器内存不足,你会得到std::bad_alloc
异常?
@user1173240 PS。如果您想要这种行为,请查看 boost::circular_buffer 例如boost.org/doc/libs/1_55_0/doc/html/circular_buffer.html
非常感谢。我去看看。以上是关于从 Boost InterProcess Shared Memory 中检索共享向量的主要内容,如果未能解决你的问题,请参考以下文章
从 Boost InterProcess Shared Memory 中检索共享向量
boost::interprocess::string 转换为 char*
boost::interprocess_mutex 与进程本地 boost::mutex
boost::interprocess::interprocess_condition::wait 在等待时不会原子地解锁互斥锁