2013-08-31 13 views
5

多くのtcp接続を処理するために(シングルスレッド)boost::asio:io_serviceを使用しています。接続ごとに、私はタイムアウトを捕まえるためにdeadline_timerを使います。いずれかの接続がタイムアウトした場合、他の接続の結果は使用できません。したがって、私はio_serviceを完全に再起動したいと思います。 io_service.stop()を呼び出すと、キュー内の「終了済み」ハンドラが呼び出され、キュー内でエラーが発生したハンドラが呼び出されることが考えられました。stop()の後にboost :: asio :: io_serviceをクリアします。

ハンドラがキューに残っているように見えるため、io_service.reset()以降を呼び出すと、io_service.run()は古いハンドラをバックアップします。 io_service.stop()が呼び出された後でも実際にハンドラがキューに残っていることを誰でも確認できます。もしそうなら、io_serviceを完全にリセットする可能性はありますか?キューに入れられたハンドラをすべて削除しますか?

答えて

6

io_service::stop()およびio_service::reset()は、io_serviceのイベントループの状態のみを制御します。遅延呼び出し(実行準備完了)またはユーザー定義のハンドラー・オブジェクト用にスケジュールされたハンドラーの存続期間に影響することはありません。

io_serviceためdestructorは、すべての未処理のハンドラが破壊されるようになります:io_serviceに関連付けられている

  • 各サービスオブジェクトは、そのshutdown_service()メンバ関数が呼び出されています。 Serviceタイプ要件の場合、shutdown_service()メンバ関数は、サービスが保持するユーザー定義のハンドラオブジェクトのすべてのコピーを破棄します。
  • io_serviceおよびその任意のストランドについて、呼び出されないハンドラオブジェクトが破棄されます。

いずれかを考えてみましょう:

  • io_serviceオブジェクトの寿命を制御します。 1つのアプローチはthis答えで見つけることができます。
  • io_serviceを実行して完了します。これにはしばしば状態を設定し、未処理の操作を取り消し、補完ハンドラがio_serviceに追加作業をポストするのを防ぐ必要があります。 Boost.Asioは公式timeoutの例を提供し、完了までにio_serviceに実行されるタイムアウト方法もhereと表示されます。
関連する問題