7

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

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

4

1 に答える 1

10

io_service::stop() のイベントループのio_service::reset() 状態のみを制御します。io_service遅延呼び出し用にスケジュールされたハンドラー (実行可能) またはユーザー定義のハンドラー オブジェクトの有効期間にも影響しません。

デストラクタにより、io_serviceすべての未処理のハンドラが破棄されます。

  • に関連付けられた各サービス オブジェクトにio_serviceは、そのshutdown_service()メンバー関数が呼び出されます。サービスの種類の要件に従って、メンバー関数は、サービスshutdown_service()によって保持されているユーザー定義のハンドラー オブジェクトのすべてのコピーを破棄します。
  • 遅延呼び出し用にスケジュールされた、呼び出されていないハンドラー オブジェクトは、io_serviceおよびそのすべてのストランドに対して破棄されます。

次のいずれかを検討してください。

  • オブジェクトの寿命を制御しio_serviceます。この回答には、1つのアプローチがあります。
  • を実行しio_serviceて完了します。これには多くの場合、状態の設定、未処理の操作のキャンセル、および完了ハンドラーが追加の作業を に投稿するのを防ぐことが必要ですio_service。Boost.Asio は公式のタイムアウトio_serviceの例を提供しており、完了まで実行するタイムアウト アプローチもここに示されています。
于 2013-09-01T04:57:15.763 に答える