C ++複数プロセス?
-
22-07-2019 - |
質問
2つのプロセスで構成されるプロジェクトがあり、それらの間で高速かつ効率的な方法でデータを渡す必要があります。
ソケットを使用して、TCPを使用してこれを行うことができますが、両方のプロセスが常に同じコンピューター上に存在しますが、これは非常に効率的なソリューションではないようです。
" pipes"の使用に関する多くの情報があります。 Linuxで。しかし、私は主にWindowsとLinux用に(できればクロスプラットフォームライブラリ経由で)、理想的にはタイプセーフで、 ノンブロッキングマナー。
別の重要なことは、アプリケーション全体(つまり、両方のプロセス)の複数のインスタンスをサポートする必要があることです。各インスタンスは、通信オブジェクトの独自の独立したコピーを持ちます。
また、新しいプロセスを生成するクロスプラットフォームの方法はありますか?
解決
IPCの場合、 Windowsは名前付きパイプをサポート Linuxと同じようにですが、パイプ名は異なる形式に従っています。 2つのオペレーティングシステム間のパス形式の違い。これは、簡単なプリプロセッサ定義で克服できるものです。両方のオペレーティングシステムは、パイプ上の非ブロッキングIOとselect()によるIO多重化もサポートしています。
他のヒント
Boost.Interprocess をご覧ください。
Boost.Interprocess は、一般的なプロセス間通信および同期メカニズムの使用を簡素化し、それらの幅広い範囲を提供します:
- 共有メモリ。
- メモリマップファイル。
- 共有メモリおよびメモリマップファイルに配置するためのセマフォ、ミューテックス、条件変数、およびアップグレード可能なミューテックスタイプ。
- これらの同期オブジェクトの名前付きバージョン。UNIX/ Windows sem_open / CreateSemaphore APIに似ています。
- ファイルのロック。
- 相対ポインター。
- メッセージキュー。
Boost.Interprocess は、共有メモリまたはメモリマップファイルの一部を動的に割り当てる(一般的に、固定サイズのメモリセグメントの一部を割り当てる)高レベルのプロセス間メカニズムも提供します。 Boost.Interprocessは、これらのメカニズムを使用して、共有メモリおよびメモリマップファイルにSTLのようなコンテナを含むC ++オブジェクトを構築するための便利なツールを提供します。
- 匿名および名前付きオブジェクトの共有メモリまたはメモリマップファイルでの動的作成。
- 共有メモリ/メモリマップファイルと互換性のあるSTLのようなコンテナ。
- 複数のメモリ割り当てパターン(プーリングなど)を実装する共有メモリ/メモリマップファイルに対応するSTLのようなアロケータ。
Boost.Interprocess は、次のコンパイラ/プラットフォームでテストされています:
- Visual 7.1 Windows XP
- Visual 8.0 Windows XP
- GCC 4.1.1 MinGW
- GCC 3.4.4 Cygwin
- Intel 9.1 Windows XP
- GCC 4.1.2 Linux
- GCC 3.4.3 Solaris 11
- GCC 4.0 MacOs 10.4.1
プレーンな古いTCPはかなり効率的に動作するはずです。私が理解しているように、現代のOSはTCP接続の両端が同じマシンにあることを検出し、通常のTCPスタックではなく高速で軽量の(パイプのような)メカニズムを介して内部的にそのデータをルーティングします。
したがって、TCP上で動作するコードを既にお持ちの場合は、それを固守し、あまり成果を上げないために余分な開発時間を費やすことは避けてください。
やり過ぎかもしれませんが、Apache Portable Runtimeを使用できます。 ここはスレッドおよびプロセス関数です。