Heim > Backend-Entwicklung > C++ > Hauptteil

Wie kann ich einen Boost ASIO Deadline Timer in einem separaten Thread zuverlässig abbrechen?

Barbara Streisand
Freigeben: 2024-10-29 07:03:30
Original
475 Leute haben es durchsucht

How to reliably cancel a Boost ASIO Deadline Timer in a separate thread?

Boost ASIO Deadline Timer sicher abbrechen

Der bereitgestellte Code soll einen boost::asio::basic_waitable_timer sicher in einem separaten Thread abbrechen . Es scheint jedoch, dass die Stornierung aufgrund eines zugrunde liegenden Problems nicht wie erwartet funktioniert.

Verstehen des Problems:

Das Problem ergibt sich aus der Tatsache, dass der bereitgestellte Code versucht, den Timer mithilfe der Post-Funktion abzubrechen, die den Abbruchvorgang zur Ereigniswarteschlange des io_service des Timers hinzufügt. Dieser Ansatz ist problematisch, denn wenn der Timer bereits abgelaufen ist, bevor der Abbruchvorgang ausgeführt wird, wird der Abbruchvorgang ignoriert, sodass der Timer effektiv in einem aktiven Zustand verbleibt.

Behebung des Problems:

Um dieses Problem zu beheben, müssen wir eine robuste Möglichkeit entwickeln, den Timer unabhängig von seinem aktuellen Status abzubrechen. Ein wirksamer Ansatz besteht darin, einen Sentinel-Wert für den Ablaufzeitpunkt des Timers einzuführen, der einen ungültigen Zustand anzeigt. Indem wir den Ablauf des Timers während des Abbruchvorgangs auf diesen Sentinel-Wert setzen, können wir sicherstellen, dass der Timer, selbst wenn er vor dem Abbruch abgelaufen ist, in einen ungültigen Zustand versetzt wird, wodurch weitere asynchrone Vorgänge effektiv verhindert werden.

Geänderter Code:

Implementieren Sie den Sentinel-Value-Ansatz:

<code class="cpp">timer.get_io_service().post([](){
    std::cerr << "tid: " << std::this_thread::get_id() << ", cancelling in post\n";
    // Cancel:
    timer.expires_at(Timer::clock_type::time_point::min());
});</code>
Nach dem Login kopieren

Completion-Handler-Handhabung:

Im Completion-Handler , prüfen Sie den Sentinel-Wert, um das Herunterfahren zu erkennen:

<code class="cpp">void handle_timeout(const boost::system::error_code&amp; ec)
{
    if (!ec) {
        started = true;
        if (timer.expires_at() != Timer::time_point::min()) {
            timer.expires_from_now(std::chrono::milliseconds(10));
            timer.async_wait(&amp;handle_timeout);
        } else {
            std::cerr << "handle_timeout: detected shutdown\n";
        }
    } 
    else if (ec != boost::asio::error::operation_aborted) {
        std::cerr << "tid: " << std::this_thread::get_id() << ", handle_timeout error " << ec.message() << "\n";
    }
}</code>
Nach dem Login kopieren

Mit dem Sentinel-Value-Ansatz können Sie den Timer jetzt zuverlässig abbrechen, auch wenn er bereits abgelaufen ist.

Das obige ist der detaillierte Inhalt vonWie kann ich einen Boost ASIO Deadline Timer in einem separaten Thread zuverlässig abbrechen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage