ホームページ  >  記事  >  バックエンド開発  >  boost::asio::basic_waitable_timer を安全にキャンセルする方法?

boost::asio::basic_waitable_timer を安全にキャンセルする方法?

DDD
DDDオリジナル
2024-10-25 11:33:02868ブラウズ

How to Safely Cancel a boost::asio::basic_waitable_timer?

Boost Asio Deadline Timer を安全にキャンセルする

この記事では、boost::asio::basic_waitable_timer timers.

問題:

当初、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&amp; 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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。