3

Boost.Interprocessを使用して実装されたIPCを使用してマルチプロデューサー/シングルコンシューマーアプリケーションを構築しています。

managed_shared_memory::allocate各プロデューサーは、共有メモリ( )内にブロックを割り当て、そのブロックにオブジェクトをマーシャリングすることによってメッセージを送信します。message_queue次に、ブロックの位置(オフセット)とサイズを保持するを介して小さなオブジェクトを送信します。

コンシューマーreceivesはキューからこのインジケーターを取得し、オブジェクトをマーシャリング解除します。消費者は、メモリのブロックの割り当てを解除する責任があります。

この実装に基づいて、メモリ内に存在するオブジェクトまたはブロックは同期が必要であるとは思わない。なぜなら、コンシューマーがそれらについて知るとすぐに、プロデューサーはそれらに触れなくなるからである。したがって、同期が必要なのは内部のみであり、同期が必要であると私は信じていmessage_queueますmanaged_shared_memory

私の質問は次のとおりです。各プロセスはシングルスレッドであることに留意してください。/ allocatedeallocateおよびsend/receive呼び出しには同期が必要ですか?

ドキュメントで提供されているBoostの例では、メッセージキューの同期を使用していませんが、これはサンプルソースを単純化するためだけのものだと思います。


私はこの質問を見ましたが、Boost.Interprocessのこれらの特定のコンポーネントについてではなく、スレッドセーフについて質問しています。

4

1 に答える 1

6

これらの操作を保護するために、いかなる種類のロックも使用する必要はありません。これらは、共有メモリ内の再帰的ミューテックスを使用してすでに保護されています。そうしないと、複数のプロセスが同じ共有メモリ ブロック内で同時に動作できなくなります。

managed_shared_memoryについて:

名前付き/一意の割り当て/検索/破棄の機能の 1 つは、それらがアトミックであることです。名前付き割り当ては、メモリ割り当てアルゴリズム テンプレート パラメーター ( ) で定義された内部の mutex_family typedef によって定義された再帰的な同期スキームを使用しますMemoryAlgorithm。つまり、名前付き/一意の割り当てを同期するために使用されるミューテックスの型は、 MemoryAlgorithm::mutex_family::recursive_mutex_type型によって定義されます。共有メモリ、およびメモリ マップされたファイル ベースのマネージド セグメントの場合、この再帰的ミューテックスは として定義されboost::interprocess::interprocess_recursive_mutexます。

これは raw 割り当てにも適用されます。これは、 を参照して確認できますboost/interprocess/mem_algo/detail/simple_seq_fit.hpp

メッセージ キューの場合、boost::interprocessこれはミューテックスと同じように同期メカニズムであると見なされ、必要なすべての保証を処理し、内部データ構造をロックし、必要に応じてメモリ バリアを発行します。

さらに、これはマルチスレッド プログラミングにも同様に当てはまります。同じプログラム内の複数のスレッドから send または allocate を呼び出していたとしても、すべて問題ありません。ロックboost::interporcess機能は、他のプロセスから保護するのと同じ方法で、他のスレッドから保護します。

于 2012-08-14T07:47:41.270 に答える