3

私は、いくつかのデータ構造を共有する必要がある2つのプロセスで構成されるアプリケーションに取り組んでいます。これらのクラスはさまざまなライブラリで編成されており、ライブラリはさまざまなアプリケーションで使用されます。

  • 私の最初の試みはWin32で名前付き共有メモリを使用することでしたが、ここでの問題は、STLコンテナを使用できないことです。
  • 解決策を探していると、 Boost Interprocessを見つけました。理解している場合は、クラス内のすべてのSTLコンテナーを「STL」BoostInterprocessコンテナーに変更する必要があります。

それで、STL(Windowsの場合)を使用してクラスまたは構造を共有する他の方法はありますか?目標は、ライブラリでBoostからの依存度が高くなりすぎないようにすることです。

ありがとう

4

3 に答える 3

7

Boost.Interprocessが独自のコンテナクラスを持っている理由は、現在のほとんどの実装がアロケータに関して標準を完全にサポートしていないためです。

Boost.Interprocessコンテナクラスは、標準コンテナの完全準拠の実装であるため、標準コンテナのドロップイン代替として使用でき、標準アロケータプロトコルをサポートするように修正されたら、ベンダー提供のコンテナに切り替えることができます。

ドキュメントよりもうまく説明できるかどうかはわかりませんが、最大の問題は、共有メモリが異なる仮想アドレスの異なるプロセスにマップされることです。そのため、コンテナ内で使用されるポインタはすべて相対ポインタである必要があります(たとえば、セグメントの始まり)。標準のアロケータモデルはこれをサポートしますが、コンテナはの代わりにを使用してこれもサポートする必要があります。これをサポートするようにすべての実装が修正されると、Boost.Interprocessコンテナーは不要になります。Allocator::pointerT *

または、各プロセスで同じ仮想アドレスにメモリをマップできる場合があります。これを行うと、生のポインターが正しく機能するため、既存の実装のコンテナーを使用できます。

于 2012-09-18T13:17:40.477 に答える
1

個人的には、共有構造アプローチは避けたいと思います。別の方法は、構造の所有権を 2 つのプロセスのいずれかに与えることです。他のプロセスは、最初のプロセスにメッセージを送信してアクセスします。

共有メモリの使用に完全に設定されている場合は、確実に STL で使用できます。まず、コンテナ用のカスタム アロケータを作成する必要があります。アロケータは、共有メモリ ブロックからメモリを割り当てます。また、STL コンテナーはスレッド セーフではないため、名前付きミューテックスを使用してコンテナーの同期ラッパーを作成する必要があります。

于 2012-09-18T13:22:05.963 に答える