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
934 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!

sumber:php.cn
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