Boost 共享向量的大小不断波动

Size of the Boost shared vector keeps fluctuating

本文关键字:共享 向量 Boost      更新时间:2023-10-16

我正在使用基于Boostshared vector作为应用程序中的IPC

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

此外,写入共享内存的应用程序

重复输出 2,作为共享内存的大小...

可能是什么错误?

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

恳请指教。

谢谢。

编辑:

写入的应用程序:

创造

    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()检查,而是在it != m_serverVector->end()条件下失败。我不知道该怎么做。

编辑 2

我看了一下文档。根据它,对于信号量部分,实际的互斥锁与共享内存相关联。因此创建了一个struct,其中有一个数组,还有一些sempahores。最终,正是这种结构在内存中共享。

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

恳请指教。

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

在进程之间共享内存存在并发突变/访问的风险。为此,您需要锁定。否则,您将引入数据争用,并根据 c++ 标准调用未定义的行为。

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

  • 命名为互斥锁(http://www.boost.org/doc/libs/1_55_0/doc/html/interprocess/synchronization_mechanisms.html#interprocess.synchronization_mechanisms.mutexes.mutexes_named_example)
  • 匿名互斥锁 (http://www.boost.org/doc/libs/1_55_0/doc/html/interprocess/synchronization_mechanisms.html#interprocess.synchronization_mechanisms.mutexes.mutexes_anonymous_example)

如果需要,可以使用信号量来获得带有"消息就绪"通知的高效消息队列。请参阅 BIP 信号量

最后,如果您使用专门为此设计的无锁容器,则可以使用无锁访问,例如共享内存IPC同步(无锁)