在C+中设计一个简单的任务调度器+; 我想在C++中实现一个简单的任务调度程序,它将支持以下内容: 计划程序将具有公共功能:“添加任务(时间,函数)” (计划程序将在X毫秒后运行该函数) 支持多线程==>意味着不同的线程可能会在中调用add_任务 与不同的并行,为调度提供不同的时间

在C+中设计一个简单的任务调度器+; 我想在C++中实现一个简单的任务调度程序,它将支持以下内容: 计划程序将具有公共功能:“添加任务(时间,函数)” (计划程序将在X毫秒后运行该函数) 支持多线程==>意味着不同的线程可能会在中调用add_任务 与不同的并行,为调度提供不同的时间,c++,multithreading,scheduled-tasks,C++,Multithreading,Scheduled Tasks,这里的主要问题是,执行任务的调用可能没有正确的执行顺序,因此,可能第一个任务将在6秒内被调用运行,1秒后,另一个调用将在2秒内执行任务 在这种情况下,我希望调度器将取消旧计时器6秒(已经过了1秒),并将第二个调用从现在起安排2秒,因为它需要首先执行 我想我必须使用优先级队列或映射来安排我的任务调用 我的问题是:设计它的最佳方式是什么? 应该涉及哪些单元,应该涉及多少线程? 谁负责什么? 我根本不需要编码,更多关于设计 这里有一个简单的例子来说明我的意思: auto func1 = []() {

这里的主要问题是,执行任务的调用可能没有正确的执行顺序,因此,可能第一个任务将在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)
对预期输出的解释:

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)

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

为什么,每个人都知道,设计此类任务的最佳方法是密切合作。有些想法可在(§1.7)和(阅读…)中找到。但你的问题很难回答。请随时通过电子邮件与我联系。我认为设计一个高效、工作良好、简单且健壮的任务调度器是不可能的。一个有趣的见解是。请通过电子邮件与我联系(我会在12小时内回复,因为我要睡觉了)。阅读-这是非常相关的我的问题不是如何获得任务排序,优先级队列和映射都能够帮助我获得按时间排序的任务,问题是我如何设计它以支持当前排名靠前的多线程应用程序(第一)计划的任务可能不是最终执行的第一个任务,因为在此期间可能会调用其他计划时间较短的任务。@ol202020,在一种方法中,“计划程序”有一个工作线程,它等待一个超时的条件变量。它计算超时值,以便在未通知条件的情况下,
wait()
调用将在下一个任务到期的确切时刻超时。
add_task(t)
方法通知相同的条件变量,如果新任务
t
成为优先级队列的新头(即,如果新任务
t
比工作线程等待的任务提前到期),则唤醒工作线程。谢谢Solomon,这是您提出的一个好主意。我能够很快实施,非常感谢!