2013-07-11 35 views
0

我想讓兩個進程訪問相同的共享內存。我有process1用my_custom_class *創建一個deque。 my_custom_class包含一些整數。boost shared_memory deque容器包含自定義類

typedef boost::interprocess::allocator<my_custom_frame*, boost::interprocess::managed_shared_memory::segment_manager> ShmemAllocator; 
typedef boost::interprocess::deque<my_custom_frame*, ShmemAllocator> VideoDeque; 

boost::interprocess::managed_shared_memory segment(boost::interprocess::create_only, "MySharedMemory", 100000000); 
video_deque = segment.construct<VideoDeque>("VideoDeque")(alloc_inst); 

使用自定義的分配器在共享存儲器中創建所述雙端隊列後,我使用創建的共享存儲器的分配方法的my_custom_frame。我首先爲my_custom_frame的大小分配內存,然後使用placement new()在那裏創建一個my_custom_frame對象。

temp1 = segment.allocate(sizeof(my_custom_frame)); 
frame1 = (my_custom_frame*) new (temp1) my_custom_frame(); 

我再通過調用幀1一個copy_dframe_to_cf方法設置my_custom_frame整數。然後我將frame1推送到video_deque。在這一點上,如果我在我的代碼中設置了一個斷點,那麼frame1中的所有整數變量都已正確設置。

frame1->copy_dframe_to_cf(video_frames[0].get()); 
video_deque->push_back(frame1); 

在process2中,打開共享內存並找到我的雙端隊列。

boost::interprocess::managed_shared_memory segment(boost::interprocess::open_only, "MySharedMemory"); 

//Find the vector using the c-string name 
VideoDeque* my_video_deque = segment.find<VideoDeque>("VideoDeque").first; 

然後我從my_video_deque獲取my_custom_frame。

typedef std::deque<my_custom_frame*> MyFrameQueue; 
MyFrameQueue my_video_frames; 

my_video_frames.push_back(my_video_deque->front()); 
my_custom_frame *pFrame; 
pFrame = my_video_frames[0]; 

在這一點上,當我看着他們都設置爲0的內存地址的P幀點的P幀的值是一樣的我已經在過程1 deque的投入,所以我想認爲我訪問相同的正確的內存位置,但由於某些原因值正在重置。任何幫助,將不勝感激。

+0

感謝凱西,改變了我的容器來使用offset_ptr後事情似乎更好。我的印象是,如果我使用共享內存段和指向該共享段中地址的常規指針,我可以跨進程引用它們。你知道如何在offset_ptr和int *之間進行memcpy嗎? – rudasi

+0

明白了,只需要在offset_ptr上使用get方法即可。 – rudasi

回答

0

在共享內存中存儲原始指針是一個禁忌:共享內存段將不會映射到所有進程中相同的地址。您需要使用offset_ptr per the boost.interprocess documentation或者按值而不是指針存儲所有內容。

typedef boost::interprocess::deque<my_custom_frame, ShmemAllocator> VideoDeque; 

typedef boost::interprocess::deque<boost::interprocess::offset_ptr<my_custom_frame>, ShmemAllocator> VideoDeque;