Membatalkan Boost Asio Deadline Timer dengan Selamat
Artikel ini membincangkan pembatalan rangsangan yang betul::asio::basic_waitable_timer
Masalah:
Pada mulanya, penyelesaian yang dicadangkan untuk membatalkan pemasa melalui timer.get_io_service().post([&]{timer.cancel() ;}) mungkin kelihatan gagal. Pemasa tidak berhenti walaupun selepas memanggil cancel().
Sebab:
Isunya terletak pada tingkah laku pemasa selepas pembatalan. Ia tidak menamatkan operasi tak segerak tertunggak dan hanya memulakan tunggu tak segerak baharu apabila pengendali penyiapan dipanggil.
Penyelesaian:
Untuk membatalkan pemasa dengan selamat, adalah penting untuk semak sama ada sebarang operasi tak segerak sedang dijalankan. Pemeriksaan ini boleh dilakukan dengan membandingkan masa tamat pemasa dengan masa semasa:
<code class="cpp">timer.get_io_service().post([](){ if (timer.expires_from_now() >= std::chrono::steady_clock::duration(0)) { timer.cancel(); } });</code>
Pembatalan Dipertingkat:
Selain membatalkan operasi semasa, ia boleh berfaedah untuk menyampaikan isyarat penutupan kepada pengendali penyiapan. Ini boleh dicapai dengan menetapkan masa tamat pemasa kepada nilai istimewa seperti Pemasa::clock_type::time_point::min().
<code class="cpp">timer.expires_at(Timer::clock_type::time_point::min());</code>
Ini membolehkan pengendali penyiapan mengenal pasti keadaan penutupan:
<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"; } }
Dengan melaksanakan teknik ini, pembatalan rangsangan::asio::basic_waitable_timer Atas ialah kandungan terperinci Bagaimana untuk Membatalkan rangsangan::asio::basic_waitable_timer dengan Selamat?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!