Консольное приложение для управления зависимыми задачами с ленивым вычислением результатов.
Программа позволяет создавать граф вычислений, где каждая задача может зависеть от результата другой задачи.
Выполняются только необходимые задачи, а повторные вычисления одного и того же результата не происходят.
Пример практического применения: нахождение корней квадратного уравнения с использованием связанных вычислений.
- Добавление задач с использованием лямбд, функций или указателей на методы классов
- Поддержка до 2 аргументов на задачу
- Ленивое вычисление результатов через
FutureResult - Получение результатов через
getResult - Выполнение всех задач через
executeAll - Автоматическое использование результатов предыдущих задач для зависимых вычислений
- C++17 или новее
- Стандартная библиотека (контейнеры, умные указатели, std::any, std::function)
- Google Test для проверки работы шедулера
# Клонирование репозитория
git clone <repository-url>
cd <project-directory>
# Создание папки для сборки
mkdir build
cd build
# Конфигурация и сборка
cmake ..
make./task_scheduler_exampleПример использования для решения квадратного уравнения:
struct AddNumber {
float add(float a) const { return a + number; }
float number;
};
float a = 1;
float b = -2;
float c = 0;
AddNumber add{.number = 3};
TTaskScheduler scheduler;
auto id1 = scheduler.add([](float a, float c) { return -4 * a * c; }, a, c);
auto id2 = scheduler.add([](float b, float v) { return b * b + v; }, b, scheduler.getFutureResult<float>(id1));
auto id3 = scheduler.add([](float b, float d) { return -b + std::sqrt(d); }, b, scheduler.getFutureResult<float>(id2));
auto id4 = scheduler.add([](float b, float d) { return -b - std::sqrt(d); }, b, scheduler.getFutureResult<float>(id2));
auto id5 = scheduler.add([](float a, float v) { return v / (2 * a); }, a, scheduler.getFutureResult<float>(id3));
auto id6 = scheduler.add([](float a, float v) { return v / (2 * a); }, a, scheduler.getFutureResult<float>(id4));
auto id7 = scheduler.add(&AddNumber::add, add, scheduler.getFutureResult<float>(id6));
scheduler.executeAll();
std::cout << "x1 = " << scheduler.getResult<float>(id5) << std::endl;
std::cout << "x2 = " << scheduler.getResult<float>(id6) << std::endl;
std::cout << "x3 = " << scheduler.getResult<float>(id7) << std::endl;TTaskScheduler— главный класс шедулераTaskWrapper<R>— шаблонный класс для хранения задачи и её результатаFutureResult<T>— объект для ленивого получения результата задачиTaskId— уникальный идентификатор задачи
Проект покрыт тестами с использованием Google Test:
- Проверка работы с различными типами возвращаемых значений (tuple, pair, int, float, string)
- Ленивое выполнение задач через
FutureResult - Проверка правильного вычисления зависимых задач
- Проверка повторного вызова
getResult - Проверка выброса исключений
- Использование type erasure для хранения задач с разными типами возвращаемых значений
- Ленивое вычисление и кеширование результата каждой задачи
- Поддержка Rvalue references и std::forward для корректной передачи аргументов
- Простая интеграция с указателями на методы классов
- Асинхронное выполнение задач в нескольких потоках
- Поддержка задач с большим количеством аргументов
- Визуализация графа зависимостей задач
- Оптимизация памяти для больших графов вычислений
Проект создан в учебных целях.