首页 > 解决方案 > 用 C++ 设计一个简单的任务调度器

问题描述

我想在 C++ 中实现一个简单的任务调度程序,它将支持以下内容:

  1. 调度器将具有公共函数:“add_task(time_ms, func)”(调度器将从现在开始在 X 毫秒内运行该函数)。
  2. 支持多线程 ==> 意味着不同的线程可能会以不同的方式并行调用 add_task 并提供不同的调度时间。

这里的主要问题是调用执行任务可能没有正确的执行顺序,所以,也许第一个任务将在 6 秒后运行,1 秒后另一个调用将在 2 秒后执行任务。

在这种情况下,我希望调度程序将取消旧计时器 6 秒(已经过了 1 秒),并将第二次调用从现在开始安排 2 秒,因为它需要首先执行。

我想我将不得不使用优先级队列或地图来订购我的任务调用,

我的问题是:设计它的最佳方法是什么?应该涉及哪些单元,应该涉及多少个线程?谁负责什么?我根本不需要编码,更多的是关于设计。

这是我的意思的一个简单示例:

auto func1 = []() { std::cout<<"Task1 is running"<<std::endl;};
auto func2 = []() { std::cout<<"Task2 is running"<<std::endl;};
auto func3 = []() { std::cout<<"Task3 is running"<<std::endl;};

add_task(6000, func1);
this_thread::sleep_for(std::chrono::milliseconds(1000));
add_task(2000, func2);
this_thread::sleep_for(std::chrono::milliseconds(1000));
add_task(3000, func3);

预期输出将是:

Task2 is running
Task3 is running
Task1 is running

预期输出说明:

Task2 is running   ==> After 3000ms (1000ms sleep + 2000ms task scheduling)
Task3 is running   ==> After 5000ms (1000ms sleep + 1000ms sleep + 3000ms task scheduling)
Task1 is running   ==> After 6000ms (6000ms task scheduling)

标签: c++multithreadingscheduled-tasks

解决方案


您可以使用优先队列数据结构。每次调用都会add_task将一个元素插入到 p 队列中,按给定时间(以毫秒(键)为单位)更改它们的顺序。收集所有任务,在运行所有任务时,您只需在给定时间弹出可用线程中的顶部元素。


推荐阅读