0

fork()Cでは、FIFO パイプを使用してマルチプロセス アプリケーションを作成し、通信することができます。C++ はマルチスレッド アプリケーションのみをサポートし、マルチプロセス アプリケーションが必要な場合は に依存する必要があることを知りましたfork()

しかし、C++ では型チェックが非常に重要であるため、リスクなしでパイプを介してオブジェクトをパイプすることはできません。void*キャストして要求sizeofし、パイプを介してすべてを送信して、元のオブジェクトに型キャストすることができます。

では、なぜこれが間違っていると感じるのでしょうか。マルチプロセス アーキテクチャは C++ で使用されていませんか、それともライブラリやより良い方法がありますか。少しググったところ、マルチスレッド C++ またはマルチプロセス C しか見つかりませんでした。

より多くのプロセスが必要な理由は、アプリケーションを可能な限り堅牢にしたいからです。Web サービスがクラッシュした場合、メイン プロセスで再起動する必要があります。あるスレッドが別のスレッドでメモリを破損していないかどうかがわからないため、これをマルチスレッドで行う方法はありません。そのため、1 つのスレッドでエラーが発生した場合は、安全のために再起動する必要があります。

4

2 に答える 2

0

マルチプロセスプログラムとは、共有データを使用してプログラムの2つの別個のインスタンスを同時に実行することを意味すると思います。プロセス間の通信には注意が必要です。私はいつもあなたが説明したパイプ型キャストの方法で、またはローカルソケットシステムを使用してデータを送受信することでうまくいきましたが、プロセス間の高レベルの通信用のライブラリが存在します。boost.interprocessを参照してください。見て、それがあなたのニーズに合うかどうか見てください。

于 2013-03-11T17:46:04.680 に答える
0

あなたの質問を正しく理解している限り、あなたの主な問題は、ある種のシリアル接続を介してあるプロセスから別のプロセスにデータを渡すことです。

これが当てはまり、フラットなデータ構造を上下に渡すだけの場合は、既に説明した方法を使用しても問題はありません。一連のビット全体をラインに落として、ラインの反対側の対応する型にキャストするだけです。同じコンパイラによって生成された実行可能ファイルと同じコンパイラスイッチを使用して、同じマシン上で実行されているプロセスとのみ通信している限り、バイトオーダー、メンバーの配置などに問題はありません。

一方、データがより複雑で、動的な長さなどの他のオブジェクト リストへの何らかの参照が含まれている場合は、void* への単純なキャストを使用してデータをビットごとにポンプする戦略を使用すると、すぐに大きな問題が発生します。したがって、オブジェクトの「シリアル化」と「逆シリアル化」には、より洗練されたアプローチが必要になることは間違いありません。

これら ( 「シリアライゼーション」「デシリアライゼーション」 ) は、問題に最も適したアプローチを見つけるためにさらに調査する必要がある 2 つの用語です。

すぐにわかるように、これらの問題は、sun RPC で使用される XDR や ASN.1 のような標準の動物園で何度も何度も発明された「解決策」の問題であり、どれがどれであるかを判断するのは困難です。ユースケースに最適です。

C++ を使用する場合は、ブーストが提供するソリューションを確認することをお勧めします ( http://www.boost.org/doc/libs/1_39_0/libs/serialization/doc/index.htmlを参照)。 )

繰り返しになりますが、やり取りするのがフラットなデータ構造である場合は、そのようなオーバーヘッドを気にせず、データをビットごとに送信するだけです。

于 2013-03-11T18:00:36.417 に答える