誰もがC ++用の優れた共有メモリコンテナを持っていますか?
-
06-07-2019 - |
質問
長い間、共有メモリセグメントまたはメモリマップファイルに配置できるSTLishコンテナが欲しいと思っていました。
カスタムアロケーターと新しい配置を使用して、通常のSTLコンテナーを共有メモリセグメントに配置することを検討しました。 (このように、ddj 記事)。問題は、STLコンテナーが所有するメモリへのポインターを内部的に持っていることです。したがって、共有メモリセグメントまたはメモリマップファイルが別のベースアドレスにロードされると(おそらく、その後の実行時または2番目のプロセスで)、内部ポインタは突然無効になります。私が理解できる限り、カスタムアロケーターアプローチは、常に同じアドレスでプロセスにメモリセグメントをマップできる場合にのみ機能します。少なくともメモリにマップされたファイルについては、システムにそれを好きな場所にマップさせただけではそうではないという経験がたくさんあります。
これを行う方法についてはいくつかの考えがありますが、他の誰かが既に作業を行っている場合はそれを避けたいと思います(それは私です、怠け者です)。
最適なロック戦略はアプリケーションに大きく依存しているため、現在はロックを議論から除外しています。
解決
このための最良の出発点は、おそらくブーストインタープロセスライブラリです。彼らはここで共有メモリ内のマップの良い例を持っています: プロセス間マップ
おそらく、参照している内部ポインターの問題を解決するオフセットスマートポインターに関するセクションも読む必要があります。 オフセットポインター
他のヒント
ACE で(数年前)いつも良い経験をしました。ネットワーク/通信フレームワークですが、共有メモリに関するセクションがあります。
QtのQSharedMemory実装を使用してみてください。