2012-05-13 17 views
0

N台のサーバに接続するプロセスを書くためにboost :: asioを初めて使用しようとしています。マルチクライアントプロセスのためのboost :: asioの正しい使い方

私の質問は、非同期性がどのように作用するかに関するものです。私の設計目標は、すべてのサーバーに並行して接続し、すべてのサーバーから並列にデータを読み取ることです。これはasync_connectとasync_readで行い、io_service :: run()をN回呼び出してから結果を読み込む必要があります。そして、問題は、並列性を実現するために、io_service :: run()を1つのスレッドからN回連続して呼び出すだけで十分ですか?

これはasioの実装上の問題であることに注意してください。具体的には、connect_asyncとwrite_asyncを呼び出すときに、OSが接続/読み取りを開始するようにOSに指示しますか?ワーカースレッドとすぐに戻りますか? - 単一のスレッドからのio_service :: run()の呼び出しが、タスクの逐次実行を意味するケース。

私の推測は前者ですが、私は確かめるために誰かが必要です。 async_xxx呼び出しが返されると非同期のもの(http://think-async.com/Asio/boost_asio_1_3_1/doc/html/boost_asio/overview/core/basics.html)のドキュメントには言及していないことがわかります。私の質問を明確にします。

答えて

1

asioの中心は、ブロックループであるio_service::run()の呼び出しから始まるイベントループです。 async_connectに電話すると、io_servicesイベントキューに接続操作がキューイングされます。並列処理を実現するには、スレッドプールを作成し、各スレッドが同じio_serviceインスタンスにrun()を呼び出さなければなりません。

+0

複数のスレッドからrun()を呼び出しずに、I/O完了ポートなどのOSメカニズムを使用して並列処理を実行することはできません(これは接続呼び出しの場合はわかりません)。誰でもこれを確認できますか? – haelix

+1

OSレベルでは、それは同時実行(http://www.boost.org/doc/libs/1_49_0/doc/html/boost_asio/overview/core/async.html)です。アプリケーションレベルでは、それはシリアルです。非同期呼び出しは即座に戻り、I/O操作をOSに延期しますが、完了ハンドラは連続して実行されます。さて、アプリケーションで単一のスレッドしか使用していない場合は、 'io_service :: run'を複数回呼び出すべきではありません。 – Tres

+0

これは私が思ったことです(つまり、接続は並列であり、完了ハンドラはシリアルです - 明らかに、それらは単一のスレッドから呼び出されるため)。最後の問題に答えるためには、実際に 'run()'ではなく 'run_one()'をN回呼び出すことになります。ありがとう! – haelix

関連する問題