首頁 > 後端開發 > C++ > 我如何安全地取消 Boost Asio 截止計時器,即使它已經過期?

我如何安全地取消 Boost Asio 截止計時器,即使它已經過期?

DDD
發布: 2024-10-30 01:00:28
原創
193 人瀏覽過

How Can I Safely Cancel a Boost Asio Deadline Timer, Even If It's Already Expired?

安全取消Boost Asio Deadline Timer

本文將透過研究提供的程式碼範例及其相關內容,深入探討安全取消boost::asio::basic_waitable_timer 的主題意外行為。

問題

目標是使用向I/O 服務發布取消請求的推薦方法來取消截止時間計時器:

<code class="cpp">timer.get_io_service().post([&amp;]{timer.cancel();})</code>
登入後複製

然而,提供的代碼似乎併沒有如預期終止計時器。

調查問題

程式碼使用 I/O 服務、截止時間計時器和執行緒的組合來建立計時器同時啟動和取消的場景。

在計時器已過期的情況下嘗試取消時會出現此問題。在這種情況下,發布的 cancel() 請求不會生效。因此,計時器的完成處理程序繼續觸發,導致主執行緒無限期地阻塞。

偵測和處理不完整取消

為了解決這個問題,我們需要一種方法來偵測計時器是否沒有被取消。一種方法是使用計時器的到期時間點,並在啟動取消時為其分配一個特殊的「無效」值:

<code class="cpp">timer.get_io_service().post([](){
    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.expires_from_now(std::chrono::milliseconds(10));
        timer.async_wait(&amp;handle_timeout);
    } else {
        std::cerr << "handle_timeout: detected shutdown\n";
    }
}</code>
登入後複製

摘要

雖然Boost Asio 中取消非同步操作通常是安全的,但考慮情況也很重要其中,在接收到取消請求之前操作可能已經完成。使用額外的邏輯來偵測和處理此類場景可確保非同步任務的穩健取消。

以上是我如何安全地取消 Boost Asio 截止計時器,即使它已經過期?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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