Boost Asio Deadline Timer を安全にキャンセルする
この記事では、boost::asio::basic_waitable_timer
問題:
当初、timer.get_io_service().post([&]{timer.cancel() を介してタイマーをキャンセルする提案されたソリューション;}) 失敗しているように見えるかもしれません。 cancel() を呼び出した後でもタイマーは中止されません。
理由:
問題は、キャンセル後のタイマーの動作にあります。未処理の非同期操作は終了せず、完了ハンドラーが呼び出されたときに新しい非同期待機が開始されるだけです。
解決策:
タイマーを安全にキャンセルするには、次のことが不可欠です。現在進行中の非同期操作があるかどうかを確認します。このチェックは、タイマーの有効期限と現在時刻を比較することで実行できます:
<code class="cpp">timer.get_io_service().post([](){ if (timer.expires_from_now() >= std::chrono::steady_clock::duration(0)) { timer.cancel(); } });</code>
拡張キャンセル:
現在の操作をキャンセルすることに加えて、次のことができます。シャットダウン信号を完了ハンドラーに伝達すると有益です。これは、タイマーの有効期限を Timer::lock_type::time_point::min() のような特別な値に設定することで実現できます。
<code class="cpp">timer.expires_at(Timer::clock_type::time_point::min());</code>
これにより、完了ハンドラーがシャットダウン状態を識別できるようになります。
<code class="cpp">void handle_timeout(const boost::system::error_code& ec) { if (timer.expires_at() != Timer::time_point::min()) { // timer is not in shutdown state // ... } else { // timer is in shutdown state std::cerr << "handle_timeout: detected shutdown\n"; } }
これらの手法を実装することで、boost::asio::basic_waitable_timer 以上がboost::asio::basic_waitable_timer を安全にキャンセルする方法?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。