Для этого я реализовал проверку, которая проверяет правильность работы очереди io_context, планируя задачу каждые 30 секунд. Эта задача просто устанавливает флаг в значение true, чтобы мы могли убедиться, что очередь по-прежнему отвечает.
Код: Выделить всё
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));
Код: Выделить всё
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");
});
Это происходит, поскольку 30-секундная периодическая задача, которая помечает контекст как активный, не выполняется более 2 минут. В результате сторожевой таймер предполагает, что io_context не отвечает, и пытается прервать службу.
Интересно, io_context_alive_cv_ типа std::condition_variable тикает во время спящего режима, в то время как время, основанное на ускорении задачи поддержания активности, в это время простаивает. Если да, возможно, вы подскажете мне способ решения этой проблемы?
Спасибо
Подробнее здесь: https://stackoverflow.com/questions/798 ... ailability
Мобильная версия