Planificador de tareas en C++: Resumen y ejemplos de uso
En el desarrollo moderno con C++, a menudo surge la necesidad de ejecutar ciertas acciones según un horario, con un retraso o periódicamente. Para ello se utilizan planificadores de tareas (task schedulers). En este artículo, analizaremos tres enfoques y bibliotecas populares para implementar un planificador de tareas en C++: TaskFlow, CronCpp y Boost.Asio. Aprenderá a elegir la herramienta adecuada para su proyecto y verá ejemplos de código.
¿Por qué se necesita un planificador de tareas?
Un planificador de tareas permite:
- Ejecutar operaciones en segundo plano en un momento específico (por ejemplo, limpiar la caché a las 3:00).
- Iniciar tareas periódicas con un intervalo definido (por ejemplo, consultar un sensor cada 5 segundos).
- Retrasar la ejecución de una tarea durante un tiempo determinado.
- Gestionar la ejecución paralela de tareas teniendo en cuenta las dependencias.
1. TaskFlow — planificador moderno con grafo de tareas
TaskFlow es una biblioteca para construir grafos de tareas con soporte para planificación y ejecución paralela. Es especialmente útil cuando las tareas dependen unas de otras y deben ejecutarse en un orden específico.
Características principales de TaskFlow:
- Construcción de grafos acíclicos dirigidos (DAG) de tareas.
- Soporte para dependencias condicionales y cíclicas.
- Distribución automática de tareas entre hilos.
- Soporte integrado para temporizadores y retrasos.
Ejemplo: tarea simple con retraso
#include <taskflow/taskflow.hpp>#include <iostream>#include <chrono>
int main() { tf::Executor executor; tf::Taskflow taskflow;
// Creamos una tarea con un retraso de 2 segundos auto [A, timer] = taskflow.emplace([](){ std::cout << "Tarea A ejecutada después de 2 segundos" << std::endl; });
// Configuramos el temporizador timer.name("timer"); timer.silent_delay(std::chrono::seconds(2));
// Iniciamos el planificador executor.run(taskflow).wait(); return 0;}Este código crea una tarea que se ejecutará 2 segundos después de iniciar el planificador. TaskFlow gestiona automáticamente los hilos y el tiempo.
2. CronCpp — planificador ligero con sintaxis cron
CronCpp es una biblioteca minimalista para planificar tareas con programación cron. Es ideal si necesita definir tiempos de ejecución en un formato familiar (como en Linux cron).
Características principales de CronCpp:
- Soporte para sintaxis cron estándar (minutos, horas, días, meses, días de la semana).
- Ligero: no requiere Boost ni otras dependencias pesadas.
- API simple para agregar y eliminar tareas.
Ejemplo: tarea cada minuto
#include <croncpp/croncpp.h>#include <iostream>#include <thread>#include <chrono>
int main() { cron::Cron cron; // Agregamos una tarea que se ejecuta cada minuto cron.schedule("* * * * *", [](){ std::cout << "¡Tarea ejecutándose cada minuto!" << std::endl; });
// Iniciamos el planificador en un hilo en segundo plano std::thread cron_thread([&cron](){ cron.start(); });
// Dejamos que funcione durante 5 minutos std::this_thread::sleep_for(std::chrono::minutes(5)); cron.stop(); cron_thread.join(); return 0;}En este ejemplo, la tarea se ejecutará cada minuto. CronCpp calcula automáticamente la próxima hora de ejecución y llama a la función.
3. Boost.Asio — potente planificador para tareas asíncronas
Boost.Asio no es solo un planificador, sino una biblioteca completa para programación asíncrona. Sus temporizadores y planificadores de tareas se utilizan ampliamente