gpt4 book ai didi

c++ - Boost共享 vector 的大小不断波动

转载 作者:太空宇宙 更新时间:2023-11-04 11:36:47 24 4
gpt4 key购买 nike

我在我的应用程序中使用基于Boost共享 vector 作为IPC

在我尝试读取共享内存的应用程序中,内存的大小 m_size 或 vector->size 一直在 2 之间波动(即我的 vector 数量m 共享 ) 和 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,里面有一个数组,还有一些信号量。最终在内存中共享的是这个结构。

在我的例子中,我在共享内存中共享一个 vector 。同样的原理是否可行,即我创建一个内部有 vector 的结构,以及互斥锁成员,并共享它?在这种情况下,要映射的结构以及内存分配器将是 struct 的结构,而不是 Vector 的结构,正如我在我的代码中所做的那样,对吗?

请指教。

最佳答案

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

在进程之间共享内存存在并发突变/访问的风险。为此,您需要锁定。否则,您会引入数据竞争,这会调用 Undefined Behaviour按照 C++ 标准。

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

看看

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

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

关于c++ - Boost共享 vector 的大小不断波动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22778553/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com