Rumah > pembangunan bahagian belakang > C++ > Bagaimana untuk Membatalkan rangsangan::asio::basic_waitable_timer dengan Selamat?

Bagaimana untuk Membatalkan rangsangan::asio::basic_waitable_timer dengan Selamat?

DDD
Lepaskan: 2024-10-25 11:33:02
asal
987 orang telah melayarinya

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

Membatalkan Boost Asio Deadline Timer dengan Selamat

Artikel ini membincangkan pembatalan rangsangan yang betul::asio::basic_waitable_timer pemasa.

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>
Salin selepas log masuk

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>
Salin selepas log masuk

Ini membolehkan pengendali penyiapan mengenal pasti keadaan penutupan:

<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";
    }
}
Salin selepas log masuk

Dengan melaksanakan teknik ini, pembatalan rangsangan::asio::basic_waitable_timer pemasa menjadi selamat dan teguh.

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!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan