Heim >Backend-Entwicklung >C++ >Wie kann ich einen boost::asio::basic_waitable_timer sicher abbrechen?

Wie kann ich einen boost::asio::basic_waitable_timer sicher abbrechen?

DDD
DDDOriginal
2024-10-25 11:33:02945Durchsuche

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

Boost Asio Deadline Timer sicher abbrechen

Dieser Artikel befasst sich mit der ordnungsgemäßen Abmeldung von boost::asio::basic_waitable_timer 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&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";
    }
}

Durch die Implementierung dieser Techniken kann die Aufhebung von boost::asio::basic_waitable_timer Timer werden sowohl sicher als auch robust.

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn