名前付きパイプ インスタンス
最も単純なパイプ サーバーは、パイプの単一インスタンスを作成し、1 つのクライアントに接続し、クライアントと通信し、クライアントから切断し、パイプ ハンドルを閉じて終了します。 ただし、パイプ サーバーが複数のパイプ クライアントと通信する方が一般的です。 パイプ サーバーでは、1 つのパイプ インスタンスを使用して、各クライアントに順番に接続して切断することで、複数のパイプ クライアントと接続できますが、パフォーマンスは低下します。 複数のクライアントを同時に効率的に処理するには、パイプ サーバーで複数のパイプ インスタンスを作成する必要があります。
複数のパイプ インスタンスにサービスを提供するための 3 つの基本的な戦略があります。
- パイプのインスタンスごとに個別のスレッドを作成します。 マルチスレッド パイプ サーバーの例については、「マルチスレッド パイプ サーバー」を参照してください。
- ReadFile、WriteFile、ConnectNamedPipe 関数で OVERLAPPED 構造体を指定して、重複する操作を使用します。 例については、「重複した I/O を使用した名前付きパイプ サーバー」を参照してください。
- 操作の完了時に実行する完了ルーチンを指定する ReadFileEx 関数と WriteFileEx 関数を使用して、重複する操作を使用します。 例については、「 完了ルーチンを使用した名前付きパイプ サーバー」を参照してください。
マルチスレッド パイプ サーバーは、各インスタンスのスレッドが 1 つのパイプ クライアントの通信を処理するため、書き込みが最も簡単です。 システムは、必要に応じて各スレッドにプロセッサ時間を割り当てます。 ただし、各スレッドはシステム リソースを使用します。これは、多数のクライアントを処理するパイプ サーバーの欠点です。
シングルスレッド サーバーを使用すると、複数のクライアントに影響を与える操作を調整しやすくなります。また、複数のクライアントによる同時アクセスから共有リソースを保護する方が簡単です。 シングルスレッド サーバーの課題は、クライアントの同時ニーズを処理するためにプロセッサ時間を割り当てるために、重複する操作を調整する必要があるということです。