Реализовать класс CallbackScheduler, который позволяет запланировать вызов
колбека (std::function<void()>) в заданный момент времени.
using TimePoint = std::chrono::time_point<std::chrono::system_clock>;
class CallbackScheduler
{
public:
using TaskId = std::uint64_t;
TaskId Schedule(std::function<void()> callback, TimePoint when);
bool Cancel(TaskId id);
};- Метод
Scheduleдолжен принимать задачу и время запуска и возвращать идентификатор задачи. - Колбек должен выполняться не раньше времени
when. - Нужно поддержать планирование нескольких колбеков.
- Если колбек запланирован на время в прошлом, его нужно выполнить как можно скорее.
- Нужно реализовать
Cancel(TaskId id)для отмены запланированной задачи. - Отменённая задача не должна быть выполнена.
- Решение должно быть потокобезопасным.
- Исключения, брошенные внутри пользовательского колбека, не должны падать за пределы рабочего потока планировщика.
std::threadstd::mutexstd::condition_variablestd::priority_queue/std::multimap/ другие структуры данных- Любые средства стандартной библиотеки C++20
- Корректность по времени выполнения колбеков
- Корректная отмена запланированных задач
- Отсутствие гонок данных и дедлоков
- Стабильная работа при нескольких запланированных задачах
- Читаемость и аккуратность кода
cmake -S . -B build
cmake --build build
ctest --test-dir build --output-on-failureinclude/callback_scheduler.h— интерфейс классаsrc/callback_scheduler.cpp— место для реализацииtests/callback_scheduler_test.cpp— минимальные тесты