我有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));
任何人都可以建议一种更好的方法将数据从共享内存复制到本地内存。
答案 0 :(得分:1)
memcpy(Mydeque_new, &Mydeque, Mydeque->size()*sizeof(REALTIME_INFO));
这是大胖Undefined Behaviour因为deque<>
不是POD类型。实际上,即使元素数据在内存中也不是连续的,所以你甚至无法记住那个。
如果只有一个消费者和一个生产者,请考虑使用spsc_queue
:Shared-memory IPC synchronization (lock-free)。这是一个潜在的无锁解决方案,它也有一个批量出队/入队接口。