2017-08-22 24 views
1

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

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

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

获得第一个指针后,我试图把它复制到另一个​​,但我只能访问第一指针,并且不能重复剩余的数据。

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

任何人都可以提出一个更好的办法来从共享存储复制数据到本地内存。

+2

您使用什么策略来避免数据竞争?从排列代码的外观来看,您似乎需要同时访问这两个应用程序,所以我想象限制对整个内存块的访问不适用于您。你如何处理这个问题将会告诉你哪一个startegy是合适的。 – Frank

+0

我们可以怀疑'REALTIME_INFO'是否是POD?还有@弗兰克说:防止竞争条件。 – user0042

+0

@Frank其实你是对的。我尝试使用named_mutex,但是这开始崩溃了第二个应用程序。由于managed_shared _memory自动同步,我认为不使用任何互斥锁。这仍处于初始阶段。你能指出我正确使用互斥体的方向吗? – brownKnight

回答

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

这是大发Undefined Behaviour因为deque<>是不是一个POD类型。实际上,即使元素数据在内存中不是连续的,所以你甚至不能使用memcpy

相关问题