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

Best way to dump data from boost shared memory

我有 2 个应用程序。一种写入高频数据以提升托管共享内存,数据结构为提升双端队列。

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);
}

我的第二个应用程序是一个 Qt 应用程序,当按下按钮时从共享内存读取并写入 csv 文件。由于数据很大,我不能直接从共享内存写入数据,所以我尝试了 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));

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

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

这太胖了 Undefined Behaviour 因为 deque<> 不是 POD 类型。事实上,即使元素数据在内存中也不连续,所以你甚至不能 memcpy that.

  • 考虑使用 Boost Interprocess Message Queue

  • 如果只有一个消费者和一个生产者,请考虑使用 spsc_queueShared-memory IPC synchronization (lock-free)。这是一个潜在的无锁解决方案,它也有一个 bulk-dequeue/enqueue 接口。