本文將透過研究提供的程式碼範例及其相關內容,深入探討安全取消boost::asio::basic_waitable_timer 的主題意外行為。
目標是使用向I/O 服務發布取消請求的推薦方法來取消截止時間計時器:
<code class="cpp">timer.get_io_service().post([&]{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& ec) { if (timer.expires_at() != Timer::time_point::min()) { timer.expires_from_now(std::chrono::milliseconds(10)); timer.async_wait(&handle_timeout); } else { std::cerr << "handle_timeout: detected shutdown\n"; } }</code>
雖然Boost Asio 中取消非同步操作通常是安全的,但考慮情況也很重要其中,在接收到取消請求之前操作可能已經完成。使用額外的邏輯來偵測和處理此類場景可確保非同步任務的穩健取消。
以上是我如何安全地取消 Boost Asio 截止計時器,即使它已經過期?的詳細內容。更多資訊請關注PHP中文網其他相關文章!