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>
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& ec) { if (!ec) { started = true; 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"; } } else if (ec != boost::asio::error::operation_aborted) { std::cerr << "tid: " << std::this_thread::get_id() << ", handle_timeout error " << ec.message() << "\n"; } }</code>
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!