これは奇妙なことですが、私はただ楽しんでいます。プロセス間でSTLオブジェクトを移動する
Master
とSlave
の2つのマシン間のソケットを介して2つのプロセス間でstd::map
(メモリの固定領域で新しい配置を使用してインスタンス化)を送信しようとしています。私が使用しているマップがあり、このtypedef
:
// A vector of Page objects
typedef
std::vector<Page*,
PageTableAllocator<Page*> >
PageVectorType;
// A mapping of binary 'ip address' to a PageVector
typedef
std::map<uint32_t,
PageVectorType*,
std::less<uint32_t>,
PageTableAllocator<std::pair<uint32_t, PageVectorType*> > >
PageTableType;
PageTableAllocator<T>
クラスはSTLコンテナは、メモリ内の固定位置に必要/したいことが何でもメモリの割り当てを担当しています。たとえば、すべてのPage
オブジェクトとSTL内部構造がこの固定メモリ領域でインスタンス化されています。これにより、std::map
オブジェクトとアロケータの両方がであり、両方ともがメモリの固定領域に配置されます。私はマップとアロケータが正しく動作することを確認するためにGDBを使用しました(使用されているすべてのメモリは固定された領域にあり、アプリケーションの通常のヒープになることはありません)。
Master
が起動し、そのすべてのSTL構造体と特別なメモリ領域が初期化されると、以下のことが起こります。 Slave
が開始され、ページテーブルのバージョンが印刷され、Master
が検索されます。 Slave
はマスターを見つけ、ページテーブルのバージョンを削除し、Master
のページテーブル(および特別なメモリ領域)のバージョンをコピーし、を正常にコピーします。はページテーブルのMaster
のバージョンを出力します。私がGDBで何をしたのかから、多くの読み取り専用操作を実行できます。
新たにコピーされたPageTableType
オブジェクトにアロケータのvoid construct (pointer p, const T& value)
メソッドのSlave
フォルトを追加しようとすると、 p
として渡された値は、既に割り当てられたメモリ領域を指しています(Master
のバージョンstd::map
)。
私はC++オブジェクト構造について何も知らないが、私はPageTableType
のSlave
のバージョンからオブジェクトの状態は、私がPageTableType
とそのアロケータを使用しているメモリのすべてを交換した後もぶらぶらしなければならないことを推測しています。 私の質問は、これが有効な懸念事項であるかどうかです。 C++はオブジェクトがインスタンス化されたメモリの領域外にある種のオブジェクト状態を維持していますか?
マップで使用されているオブジェクトはすべてPODではありません。同じことがアロケータにも当てはまります。
共有メモリのどの部分が割り当てられているかを決定するメタデータをどこに保存しますか? –
私はアプリケーション内でメモリ割り当てコード( 'malloc'、' free'など)へのすべての呼び出しを再定義しました。ノードがメモリを割り当てるとき、オフセットはこの 'std :: map'オブジェクトに記録されます。 'Slave'が地図を更新しようとすると(送信後)、それは失敗します。 – sholsapp
それは私が言っていることです。記録*どこに*? –