c++ - 用 C++ 设计一个简单的任务调度器
问题描述
我想在 C++ 中实现一个简单的任务调度程序,它将支持以下内容:
- 调度器将具有公共函数:“add_task(time_ms, func)”(调度器将从现在开始在 X 毫秒内运行该函数)。
- 支持多线程 ==> 意味着不同的线程可能会以不同的方式并行调用 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)
解决方案
您可以使用优先队列数据结构。每次调用都会add_task
将一个元素插入到 p 队列中,按给定时间(以毫秒(键)为单位)更改它们的顺序。收集所有任务,在运行所有任务时,您只需在给定时间弹出可用线程中的顶部元素。
推荐阅读
- swift - 可以将基于 Xcode 文档的应用程序设置为始终在新选项卡中打开吗
- mysql - 如何升级 Ubuntu 到 20.04 LTS 防止 MySQL 升级到 8?
- javascript - 使用 TMDB API 的 JSON 到 HTML 输出
- javascript - 如何分别返回数组的每一项js
- python - 基于数据框中其他列 2 行的新列
- c++ - 冻结(挂起)会发生在不使用互斥锁、信号量等的线程不安全代码中吗?
- wordpress - Hello elementor 子主题中的 style-editor.css
- python - 如何将张量转换为张量列表
- json - Vue 3,从 POST 解析嵌套的 json 数据
- mysql - 如何使用 SQL 选择单词的第一个字母?