4

boost:asio を使用して双方向通信を実装しようとしています。複数のクライアントと通信するサーバーを書いています。

クライアントとの間での書き込みと読み取りが同期と順序なしで行われるようにしたい-クライアントはいつでもサーバーにコマンドを送信でき、ループ内のデータを受信します。もちろん、共有リソースへのアクセスは保護する必要があります。

これを達成するための最良の方法は何ですか?読み取り用と書き込み用の 2 つのスレッドを使用することは適切なオプションですか? 接続を受け入れて多くのクライアントを管理するのはどうですか?

//編集

「同期と順序なし」とは、サーバーが常にクライアントにデータをストリーミングする必要があり、現在何が送信されているかに関係なく、いつでもクライアントの要求に応答 (動作を変更) できることを意味します。

4

2 に答える 2

4

asioの背後にある重要なアイデアの1つは、複数のクライアントセッションを処理するために複数のスレッドを必要としないということです。あなたの説明は少し一般的ですが、「クライアントとの間の書き込みと読み取りを同期と順序なしで実行したい」とはどういう意味かわかりません。

良い出発点は、asioチャットサーバーの例です。この例では、chat_session接続されているクライアントごとにクラスのインスタンスが作成されていることに注意してください。そのクラスのオブジェクトは、接続が有効であると同時に、接続されたクライアントにデータを書き込むことができる限り、非同期読み取りを送信し続けます。その間、クラスのオブジェクトはchat_server新しい着信クライアント接続を受け入れ続けます。

于 2012-11-27T00:09:46.067 に答える
1

職場では、概念的に非常に似たようなことを行っていますが、重いハンドラーがパフォーマンスに大きな影響を与えることに気付きました。コード/書き込みハンドラーの書き込み側は、あまりにも多くの作業を行い、ワーカー スレッドを長時間占有するため、プログラム フローが危険にさらされます。特に、RST パケット (クローズされた接続) は、読み取りハンドラーによって十分に迅速に検出されませんでした。これは、書き込みアクションにかなりの時間がかかり、ワーカー スレッドの処理時間のほとんどが占有されていたためです。現在、コードの 1 行の処理時間が不足しないように、2 つのワーカー スレッドを作成することでこれを修正しました。確かに、これは理想とはほど遠いものであり、最適化の長い To Do リストに含まれています。

簡単に言えば、ハンドラーが軽量で、2 番目のスレッドがプログラムの残りの部分を処理する場合、読み取りと書き込みに 1 つのスレッドを使用することで問題を解決できます。奇妙な同期の問題に気付いたら、ネットワーク ハンドラーを軽量化するか、ワーカー プールにスレッドを追加する必要があります。

于 2015-03-09T20:42:36.213 に答える