Heim >Backend-Entwicklung >C++ >Wie kann ich einen boost::asio::basic_waitable_timer sicher abbrechen?
Boost Asio Deadline Timer sicher abbrechen
Dieser Artikel befasst sich mit der ordnungsgemäßen Abmeldung von boost::asio::basic_waitable_timer
Problem:
Zunächst die vorgeschlagene Lösung zum Abbrechen eines Timers über timer.get_io_service().post([&]{timer.cancel() ;}) scheint möglicherweise fehlzuschlagen. Der Timer bricht auch nach dem Aufruf von cancel() nicht ab.
Grund:
Das Problem liegt im Verhalten des Timers nach dem Abbruch. Es beendet keine ausstehenden asynchronen Vorgänge und startet einfach eine neue asynchrone Wartezeit, wenn der Abschlusshandler aufgerufen wird.
Lösung:
Um einen Timer sicher abzubrechen, ist es wichtig, Folgendes zu tun Überprüfen Sie, ob derzeit asynchrone Vorgänge ausgeführt werden. Diese Prüfung kann durchgeführt werden, indem die Ablaufzeit des Timers mit der aktuellen Zeit verglichen wird:
<code class="cpp">timer.get_io_service().post([](){ if (timer.expires_from_now() >= std::chrono::steady_clock::duration(0)) { timer.cancel(); } });</code>
Erweiterte Stornierung:
Zusätzlich zum Abbrechen des aktuellen Vorgangs ist dies möglich Es kann von Vorteil sein, dem Completion-Handler ein Shutdown-Signal zu übermitteln. Dies kann erreicht werden, indem die Ablaufzeit des Timers auf einen speziellen Wert wie Timer::clock_type::time_point::min() gesetzt wird.
<code class="cpp">timer.expires_at(Timer::clock_type::time_point::min());</code>
Dadurch kann der Abschlusshandler den Shutdown-Status identifizieren:
<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"; } }
Durch die Implementierung dieser Techniken kann die Aufhebung von boost::asio::basic_waitable_timer Das obige ist der detaillierte Inhalt vonWie kann ich einen boost::asio::basic_waitable_timer sicher abbrechen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!