0

2 つのプロセスが同じ共有メモリにアクセスしようとしています。my_custom_class* で deque を作成する process1 があります。my_custom_class にはいくつかの整数が含まれています。

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

カスタム アロケータを使用して共有メモリに両端キューを作成した後、共有メモリで allocate メソッドを使用して my_custom_frame を作成します。最初に my_custom_frame のサイズのメモリを割り当て、次に配置 new() を使用して、そこに my_custom_frame オブジェクトを作成します。

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

次に、frame1 で 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);

プロセス 2 では、共有メモリを開き、deque を見つけます。

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];

この時点で、pFrame の値を見ると、それらはすべて 0 に設定されています。pFrame が指すメモリ アドレスは、プロセス 1 で両端キューに配置したものと同じであるため、同じ正しいメモリ位置にアクセスしていると思いたいのですが、何らかの理由で値がリセットされています。どんな助けでも大歓迎です。

4

1 に答える 1

0

生のポインタを共有メモリに格納することは絶対に許されません。共有メモリ セグメントがすべてのプロセスで同じアドレスにマップされる可能性はほとんどありません。boost.interprocess ドキュメントごとに offset_ptrを使用するか、ポインタではなく値ですべてを格納する必要があります。

つまり、

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

また

typedef boost::interprocess::deque<boost::interprocess::offset_ptr<my_custom_frame>, ShmemAllocator> VideoDeque;
于 2013-07-11T20:21:58.470 に答える