Boost.Interprocessを使用して実装されたIPCを使用してマルチプロデューサー/シングルコンシューマーアプリケーションを構築しています。
managed_shared_memory::allocate
各プロデューサーは、共有メモリ( )内にブロックを割り当て、そのブロックにオブジェクトをマーシャリングすることによってメッセージを送信します。message_queue
次に、ブロックの位置(オフセット)とサイズを保持するを介して小さなオブジェクトを送信します。
コンシューマーreceives
はキューからこのインジケーターを取得し、オブジェクトをマーシャリング解除します。消費者は、メモリのブロックの割り当てを解除する責任があります。
この実装に基づいて、メモリ内に存在するオブジェクトまたはブロックは同期が必要であるとは思わない。なぜなら、コンシューマーがそれらについて知るとすぐに、プロデューサーはそれらに触れなくなるからである。したがって、同期が必要なのは内部のみであり、同期が必要であると私は信じていmessage_queue
ますmanaged_shared_memory
。
私の質問は次のとおりです。各プロセスはシングルスレッドであることに留意してください。/ allocate
、deallocate
およびsend
/receive
呼び出しには同期が必要ですか?
ドキュメントで提供されているBoostの例では、メッセージキューの同期を使用していませんが、これはサンプルソースを単純化するためだけのものだと思います。
私はこの質問を見ましたが、Boost.Interprocessのこれらの特定のコンポーネントについてではなく、スレッドセーフについて質問しています。