从 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&lt;VECTOR_TYPE&gt;("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内存位置

boost::interprocess::string 转换为 char*

boost::interprocess_mutex 与进程本地 boost::mutex

boost::interprocess::interprocess_condition::wait 在等待时不会原子地解锁互斥锁

boost::interprocess::message_queue 权限被拒绝