Я попал в состояние гонки в проекте, над которым я работаю, связанным с управлением несколькими таймерами повышения форсированных сроков .У проекта есть класс, который, по сути, является оберткой для вектора таймеров крайнего срока (давайте назовем этот класс TimerCollection
) и имеет общедоступную функцию scheduleWork
, которая принимает смещение в мс и std::function
и создает новый таймер крайнего срока, добавляет его к вектору и вызывает async_await
с std::function
в качестве обработчика.
Проблема в том, что TimerCollection
периодически очищает таймеры с истекшим сроком действия и проверяет, истек ли таймер, проверяя basic_deadline_timer :: expires_from_now <= 0 ... проблема в том, что обработчики таймера не выполняются сразу по истечении таймера, из того, что я понимаю, они помещаются в очередь, а служба ввода-вывода убирает обработчики из этой очередии выполняет их, когда это возможно, поэтому существует условие состязания, при котором таймер может быть удален перед выполнением обработчика, поэтому обработчик заканчивается выполнением с кодом ошибки <code>boost::asio::error::operation_aborted.
Я пытаюсь подуматьспособов решить эту проблему - несколько вариантов включают передачу общего указателя на экземпляр таймера вобработчик, поддерживающий сохранение таймера после его удаления из вектора, или создание класса-оболочки таймера с полем, которое устанавливает обработчик при его выполнении, и наличие TimerCollection
проверяет это поле перед удалением таймера.Эти решения кажутся мне немного хакерскими - есть ли лучший подход / стандартный шаблон проектирования для такого рода проблем?