Boost共享向量的大小保持波动

时间:2014-04-01 06:38:33

标签: c++ boost vector ipc shared-memory

我在我的应用程序中使用基于Boost的{​​{1}}作为shared vector

在我试图读取共享内存的应用程序中,内存的大小m_size或IPC在2之间保持波动(即向量的共享数量m&m; ),和0.我不知道为什么会这样。也许是同步问题?但即使是这种情况,内存的大小也不应该变为0,因为它只是读取内存中的任何内容。它可能无效(即旧数据),但不是0。

此外,写入共享存储器的应用程序重复输出2,作为共享存储器的大小...

可能是什么错误?

这会产生其他问题,因为我使用共享内存的大小来查看是否有任何内容写入其中。如果这不正确,我还可以使用其他参数吗?

请告知。

谢谢。

编辑:

写的申请:

创建

vector->size

现在正在写

    shared_memory_object::remove("MySharedMemory");   // CREATION
m_bIsConnectionActive = false;
srvConnections = new PwServerCheckClass();

managed_shared_memory segment(create_only, "MySharedMemory", 65536);

const ShmemAllocator alloc_inst (segment.get_segment_manager());
vector_to_send = segment.construct<VECTOR_TO_SEND>("VECTOR_TO_SEND")(alloc_inst);

申请表:

阅读:

    m_vector_to_send = srvConnections->getServerList();  //Vector whose contents are to be copied into shared vector
for(UINT loopCounter = 0; loopCounter < m_vector_to_send.size(); loopCounter++)
{
        SERVER_INFO_TYPE_CHAR TestSrv;
                    <Some code>
        vector_to_send->push_back(TestSrv); //Pushing vector back into shared memory
        wcout<<endl<<"Size of the vector is::"<<vector_to_send->size();

}

这是行为变得奇怪的地方。有时 managed_shared_memory segment(open_only, "MySharedMemory"); m_serverVector = segment.find<VECTOR_TO_SEND>("VECTOR_TO_SEND").first; //int checkSrvSize = m_serverVector->shrink_to_fit; if(m_serverVector == NULL) return; int SrvSizeCheck = 1; do { if(!(m_serverVector->empty())) continue; for(auto it = m_serverVector->begin() ; it != m_serverVector->end() ; ++it, ++SrvSizeCheck) <Some code> 会被满足,尽管有些东西被写入记忆中。有时它会超过vector->empty()检查,而是在empty()条件下失败。我不知道该怎么做。

编辑2

我看了一下文档。根据它,对于信号量部分,实际的互斥锁与共享内存相关联。所以创建了一个it != m_serverVector->end(),里面有一个数组,还有一些sempahores。最终,这种结构在内存中共享。

就我而言,我在共享内存中共享一个向量。同样的原则是否有效,即我在其中创建一个带有向量的结构,以及互斥成员,并分享它?在这种情况下,要映射的结构,以及因此内存分配器,将是struct的结构而不是Vector的结构,正如我在我的代码中所做的那样,对吗?

请告知。

1 个答案:

答案 0 :(得分:1)

是的,您似乎没有任何锁定。

在进程之间共享内存可能会导致并发突变/访问。为此你需要锁定。否则,您将引入数据竞争,并根据c ++标准调用Undefined Behaviour

事实上 - 在大多数现实情况下,您实际上需要一个互斥锁来锁定共享内存区域的创建(除非您可以证明创建是单线程的)。

看看

如果需要,可以使用信号量来生成带有“消息就绪”通知的有效消息队列。见BIP Semaphore

最后,如果您使用专为此设计的无锁容器,可以使用无锁访问,例如Shared-memory IPC synchronization (lock-free)