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

标签 c++ boost vector ipc shared-memory

我在我的应用程序中使用基于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/

相关文章:

c++ - 我的程序需要读取一个文本文件,文本文件中的数据需要用逗号分隔(C++)

c++ - ./libmylib.so : undefined reference to `submarinex::LIB::kCount'

c++ - 什么比 std::pow 更快?

c++ - 使用 Boost::spirit 编写的解析器的性能问题

c++ - 从 vector 中删除自定义对象

c++ - 找到两个 vector 相对于 vector 对象的两个成员的交集的有效方法

c++ - cocos2d-x:来自另一个类的 CRUD 二维数组

c++ - 提神气从子规则赋值

c++ - boost::condition_variable - 将 wait_for 与谓词一起使用

r - 具有重复索引的向量化循环