Um dies zu erreichen, habe ich eine Prüfung implementiert, die überprüft, ob die io_context-Warteschlange ordnungsgemäß funktioniert, indem alle 30 Sekunden eine Aufgabe geplant wird. Diese Aufgabe setzt einfach ein Flag auf „true“, damit wir bestätigen können, dass die Warteschlange noch reagiert.
Code: Select all
using PeriodicTask = BasicScheduledTask;
std::shared_ptr
io_context_alive_task_ = std::make_shared
(io_context_,
[this](const auto& ec) {
if (ec) {
print_error("Could not report io_context as alive: {}", ec.message());
return;
}
print_debug("Marking io_context as alive");
is_context_alive_ = true;
}, 30s));
Code: Select all
std::unique_ptr context_watchdog_ = std::make_unique([this] {
while (!io_context_.stopped()) {
io_context_alive_cv_.wait_for(lock, 2min, [this] { return io_context_.stopped(); });
if (!is_context_alive_) {
print_critical("io_context is not responding");
std::abort();
}
print_debug("io_context is ok, setting back to false");
is_context_alive_ = false;
}
print_debug("io_context stopped. stopping thread");
});
Dies geschieht, weil die 30-sekündige periodische Aufgabe, die den Kontext als aktiv markiert, nicht länger als 2 Minuten ausgeführt wird. Infolgedessen geht der Watchdog davon aus, dass der io_context nicht reagiert, und versucht, den Dienst abzubrechen.
Ich frage mich, ob der io_context_alive_cv_, der vom Typ std::condition_variable ist, im Ruhemodus tickt, während die Boost-basierte Zeit der Keep-Alive-Aufgabe in dieser Zeit inaktiv ist. Wenn ja, können Sie mir vielleicht einen Weg zur Lösung vorschlagen?
Vielen Dank
Mobile version