从boost共享内存中转储数据的最佳方法

时间:2017-08-22 19:18:51

标签: c++ boost shared-memory

我有2个申请。一个写高频数据来提升托管共享内存,数据结构是boost deque。

typedef boost::interprocess::allocator<REALTIME_INFO, boost::interprocess::managed_shared_memory::segment_manager> ShmemAllocator;
typedef boost::interprocess::deque<REALTIME_INFO, ShmemAllocator> MyDeque;

boost::interprocess::managed_shared_memory segment(boost::interprocess::open_or_create, "MySharedMemory",50000000); 
const ShmemAllocator alloc_inst (segment.get_segment_manager());
MyDeque *Mydeque;
Mydeque = segment.find_or_construct<MyDeque>("myd")(alloc_inst);//first ctor parameter

if(Mydeque->size() < 150000){   
    Mydeque->push_back(rtinfo);
}
else{
    Mydeque->pop_front();
    Mydeque->push_back(rtinfo);
}

当按下按钮从共享内存中读取并写入csv文件时,我的第二个应用程序是Qt应用程序。由于数据很大,我无法直接从共享内存中写入数据,所以我尝试了memcpy。我只能得到第一个值,剩下的就是垃圾。

managed_shared_memory segment (open_only, "MySharedMemory");
MyDeque *Mydeque = segment.find<MyDeque>("myd").first;

获取第一个指针后,我尝试将其复制到另一个MyDeque,但我只能访问第一个指针,无法迭代剩余的数据。

memcpy(Mydeque_new, &Mydeque, Mydeque->size()*sizeof(REALTIME_INFO));

任何人都可以建议一种更好的方法将数据从共享内存复制到本地内存。

1 个答案:

答案 0 :(得分:1)

memcpy(Mydeque_new, &Mydeque, Mydeque->size()*sizeof(REALTIME_INFO));

这是大胖Undefined Behaviour因为deque<>不是POD类型。实际上,即使元素数据在内存中也不是连续的,所以你甚至无法记住那个