web-dev-qa-db-ja.com

C ++でのプロセス間通信の最良の方法

私は2つのプロセスを持っていますが、1つは他のデータをクエリします。限られた時間内に大量のクエリがあり(1秒あたり10000)、データ(> 100 mb)が1秒あたりに転送されます。データのタイプは整数型(double)になります、int)私の質問は、このプロセスをどのように接続するかです。

共有メモリ、メッセージキュー、lpc(ローカルプロシージャコール)など。

そして、私はあなたが提案するライブラリを尋ねたいですか?ところで、MPIを提案しないでください。編集:Windows XP 32ビット

38
Qubeuc

1つの単語: Boost.InterProcess 。本当に高速にする必要がある場合は、共有メモリが適しています。オペレーティングシステムは仮想アドレスと物理アドレスの間の通常のマッピングを行うため、オーバーヘッドはほとんどありません。データのコピーは必要ありません。同時実行の問題に注意する必要があります。

shutdownqueryなどのコマンドを実際に送信するには、メッセージキューを使用します。ブーストについて知る前に、以前はlocalhostネットワークプログラミングを使用して、手動で共有メモリを割り当てていました。アプリを書き直す必要がある場合、すぐにブーストを選択します。 Boost.InterProcessは、これをより簡単にします。見てみな。

共有メモリを使用してデータを保存し、メッセージキューを使用してクエリを送信します。

6
Marc

データが複数のタイプで構成されている場合やミューテックスなどが必要な場合は、Boostを使用します。または、#pragma data_segまたはメモリマップファイルを使用して、メモリの共有セクションを使用します。

4
EhevuTov

私はマークの提案を2番目にします-移植性の懸念がないか、共有メモリ上でマップの標準コンテナタイプのようなクールなことをしたい場合(私は間違いなくboostを使用します)を除き、boosを気にしません。

それ以外の場合は、メッセージキューと共有メモリの扱いは非常に簡単です。

4
tafkaks

共有メモリを使用する場合は、スピンするかどうかを決定する必要があります。同期にセマフォを使用して共有メモリにデータを格納する場合、メッセージキューを使用する場合と比べてパフォーマンスが大幅に向上しないと思います(明瞭度が大幅に低下する場合)が、同期のためにアトミック変数をスピンすると、その結果に苦しむ必要があります。

3
Greg Rogers