我想讓兩個進程訪問相同的共享內存。我有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的投入,所以我想認爲我訪問相同的正確的內存位置,但由於某些原因值正在重置。任何幫助,將不勝感激。
感謝凱西,改變了我的容器來使用offset_ptr後事情似乎更好。我的印象是,如果我使用共享內存段和指向該共享段中地址的常規指針,我可以跨進程引用它們。你知道如何在offset_ptr和int *之間進行memcpy嗎? – rudasi
明白了,只需要在offset_ptr上使用get方法即可。 – rudasi