2012-02-16 9 views
0

私はBoost :: Asioに基づいてネットワークサーバーを開発しています。ブロックブーストAsioワーカースレッド

私は、ネットワークアクティビティがASIO(例えば。受け入れるか、受信)の活動を処理するために、これらのワーカースレッドの1つを使用して発生した場合boost::asio::io_service::run()

を呼び出すために使用IOワーカースレッドのboost::thread_groupを持っています。

私のアプリケーションは、いくつかの計算、おそらくいくつかの他のIO(boost経由)、場合によってはデータベースアクティビティを行います。

これらのスレッド内での作業がどのような意味を持つのかを知りたいと思います。具体的に:

  • IOスレッド原因 io_serviceどんな悲しみに(おそらく重要な仕事)を行っていますか?

さらに具体的には、私が考えなければならないその他の問題。

+1

ワーカースレッドから 'boost :: asio'を呼び戻すことは、私には分かりません。私はすべてのワーカースレッドが 'io_service'に追加の作業を追加することを期待します。さもなければ、イベント処理ループ(' io_service :: run() ')は終了します。 –

+0

@Sam、ありがとう - 私はおそらく、その特定の点についてあまりにも心配していると思います。私は質問を編集します。私が心配していることは、ワーカースレッドの中であまりにも多くの作業をしていることです。 – Nick

答えて

1

IOスレッド で(多分重要な作業を)実行すると、io_serviceに悲しみが生じますか?

本当にあなたが悲しみを意味するかによって異なります。 io_serviceによって呼び出されるハンドラで長時間実行される操作を実行すると、io_serviceによって追加のハンドラが呼び出されるのをブロックできます。単一のスレッドがio_service::run()を呼び出す最も簡単な例を考えてみましょう。たとえば、async_read()という非同期操作で呼び出されたハンドラが、長時間実行可能なデータベース操作を実行すると、長時間実行される操作が完了してハンドラがio_serviceに制御を戻すまで、未処理の非同期処理でハンドラが呼び出されません。

これは通常、複数のスレッドからio_service::run()を呼び出し、strandを使用して共有データを使用するハンドラへの排他的アクセスを確保することで緩和されます。すべてのハンドラが長時間実行される操作を実行する場合は、代替デザインを調査する必要があります。

関連する問題