【问题标题】:Retrieving shared vectors from Boost InterProcess Shared Memory从 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 分配器。我建议您从文档中的示例开始。

标签: c++ boost vector ipc boost-interprocess


【解决方案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
  • 非常感谢。我去看看。
猜你喜欢
  • 1970-01-01
  • 2012-09-06
  • 1970-01-01
  • 2020-10-19
  • 2020-12-30
  • 1970-01-01
  • 2012-11-05
  • 2015-09-10
  • 2015-02-14
相关资源
最近更新 更多