Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Saya Boleh Membatalkan Pemasa Tarikh Akhir Boost Asio dengan Selamat, Walaupun Ia Sudah Tamat Tempoh?
Artikel ini akan menyelidiki topik membatalkan rangsangan dengan selamat::asio::basic_waitable_timer dengan menyiasat contoh kod yang disediakan dan kodnya tingkah laku yang tidak dijangka.
Matlamatnya adalah untuk membatalkan pemasa tarikh akhir menggunakan pendekatan yang disyorkan untuk menyiarkan permintaan pembatalan kepada perkhidmatan I/O:
<code class="cpp">timer.get_io_service().post([&]{timer.cancel();})</code>
Walau bagaimanapun, kod yang disediakan nampaknya tidak menamatkan pemasa seperti yang dimaksudkan.
Kod menggunakan gabungan perkhidmatan I/O, pemasa tarikh akhir dan urutan untuk mencipta senario di mana pemasa dimulakan dan dibatalkan secara serentak.
Isu timbul apabila pembatalan cuba semasa pemasa sudah tamat tempoh. Dalam kes itu, permintaan cancel() yang disiarkan tidak akan berkuat kuasa. Akibatnya, pengendali penyiapan pemasa terus menyala, menyebabkan utas utama tersekat selama-lamanya.
Untuk menangani perkara ini, kita memerlukan cara untuk mengesan sama ada pemasa tidak dibatalkan. Satu pendekatan ialah menggunakan titik masa tamat pemasa dan menetapkan nilai "tidak sah" khas kepadanya apabila pembatalan dimulakan:
<code class="cpp">timer.get_io_service().post([](){ timer.expires_at(Timer::clock_type::time_point::min()); });</code>
Dalam pengendali penyiapan, jika titik masa tamat ditetapkan kepada nilai tidak sah ini , pengendali boleh menyedari bahawa pemasa tidak dibatalkan dan mengendalikannya dengan sewajarnya:
<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>
Walaupun pembatalan operasi tak segerak dalam Boost Asio secara amnya selamat, adalah penting untuk mengambil kira kes di mana operasi mungkin telah selesai sebelum permintaan pembatalan diterima. Menggunakan logik tambahan untuk mengesan dan mengendalikan senario sedemikian memastikan pembatalan yang mantap bagi tugas tak segerak.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Membatalkan Pemasa Tarikh Akhir Boost Asio dengan Selamat, Walaupun Ia Sudah Tamat Tempoh?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!