基本的には、わずかに異なるニーズを持つ2つのサーバーによる任意の要求を処理できる汎用マルチスレッドTCPサーバーを実装することです。特定のスレッドで同期I/Oを使用するboost asioマルチスレッドtcpサーバー
私の要件は次のとおりです。
- 全体の最初の要求が受信されるまで、要求が処理されるように開始することはできません。 (基本的には、要求の全体のサイズを含む固定サイズの要求ヘッダーがあります)。
- 要求を処理すると、要求元のクライアントに複数の応答メッセージが返される可能性があります。 IEでは、通常、リクエストは単一のレスポンスで処理できますが、長時間実行されているデータベーストランザクションに応答して、クライアントにpingして、私がまだ動作していることを知らせ、接続をタイムアウトさせないようにする必要があります。
これを達成するために、私は、ブーストv1.44のHTTPサーバーの例#2をかなり厳密に追ってきました。一般的に、この例は単純なケースで機能しています。私が気づいたのは、複数の要求を同時に処理するようにスケールアップすると、私が行った変更によって、すべての要求が1つのスレッドによってシリアルに処理されるという結果になったということです。明らかに、私は何か間違っている。
雇用者の制限のために使用している実際のコード全体を投稿することはできませんが、私は新しい接続を受け入れるために非同期呼び出しを保持していますが、非同期読み取り/書き込みを同期呼び出し。あなたが見る必要があると思う特定の作品がある場合は、私ができることを見ることができます。
私が探しているのは、個々の接続が同期I/Oを持つ単一のスレッドによって処理されるマルチスレッドTCPサーバー用のboost :: asioの使い方の指針です。繰り返しになりますが、私の抽象化はhttpサーバの例#2(CPUあたり1つのio_service)に基づいていますが、代替に柔軟に対応しています
なぜあなたはasync_read/write呼び出しを削除しましたか?おそらく、io_serviceが本当に必要なスレッド数で構成されていることを確認したでしょうか? – Nim
私は、ASIOがドキュメントに欠けていることが常にわかりました。 –