从Boost InterProcess共享内存中检索共享向量

时间:2014-02-06 09:33:27

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

我创建了一个Boost共享内存,用于共享矢量。

分享已经完成。

但是,我不明白向量是如何被推入共享内存的。

我从写入过程中对共享内存执行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
}

现在,我正在读哪个载体。推到最后一个(最新的一个)?如果我正在阅读它,它是否意味着矢量被弹出?即读取后它是否仍然存在于共享存储器中,如果是这样,共享存储器会在一段时间后溢出,我将如何阻止它?我在文档中没有看到任何关于它的内容......

1 个答案:

答案 0 :(得分:1)

向量不会“推入”共享内存。没有隐式堆栈。

相反,矢量 在共享内存中存在 。您正在阅读的内容实际上与另一个过程中的矢量相同,同时

请注意,这强烈暗示您需要共享互斥锁来同步访问权限,否则您将在线程之间(来自不同进程)进行数据争用,根据定义,这在C ++中为Undefined Behaviour


略有不同的角度:

  

我从写入过程中对共享内存执行push_back。那么向量是按照LIFO顺序像堆栈一样推入共享内存吗?

打破它:

  •   

    我对共享内存

    进行了push_back

    不,不。您push向量元素back的一个向量。此向量是您共享的单个内容,名称为"Vector_name"

  •   

    因此正在推送载体

    不,你的矢量保持原样:在共享内存中。

  •   

    像堆叠一样推入共享内存,以LIFO顺序?

    不,只有一个向量。向量本身是有序的顺序容器。它支持随机访问,所以

    for (auto it = v.begin(); it!= v.end(); ++it)
    {  // process `*it` in order
    } 
    

    VS

    for (auto it = v.rbegin(); it!= v.rend(); ++it)
    {  // process `*it` in reversed order
    } 
    

    如果您总是使用push_back进行插入,则in order迭代就像“FIFO”