首頁 > 後端開發 > C++ > 如何安全取消 boost::asio::basic_waitable_timer?

如何安全取消 boost::asio::basic_waitable_timer?

DDD
發布: 2024-10-25 11:33:02
原創
935 人瀏覽過

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

安全地取消Boost Asio Deadline Timer

本文解決了boost::asio::basic_waitable_timer<:chrono: :steady_clock>

問題:

最初,建議的解決方案是透過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::clock_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";
    }
}</code>
登入後複製

透過實現這些技術,可以取消boost::asio::basic_waitable_timer<:chrono::steady_clock> 。計時器變得既安全又強大。

以上是如何安全取消 boost::asio::basic_waitable_timer?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板