题目
编写程序,模拟操作系统的多优先级任务调度器。设计结构体 Task 包含任务 ID、优先级权重 priority 以及到达时间戳 timestamp。存入 std::priority_queue 并通过重载 operator< 或自定义仿函数实现:高优先级任务优先执行;若优先级相同,则先到达者(timestamp 较小)优先执行。
输入格式:无需外部输入。
输出格式:依次弹出并打印调度执行的任务出队序列。
数据范围与约定:结构体堆排序与多条件调度逻辑。
思路与算法
1. 比较谓词的逻辑设定
在 priority_queue 默认大顶堆下,若定义 TaskA < TaskB 为真,则 TaskB 排在更前面(先执行)。因此:当 a.priority != b.priority 时,权重小的排在后面,即 a.priority < b.priority;当权重相等时,时间戳大的排在后面,即 a.timestamp > b.timestamp。
2. 避免运算符侵入性
使用独立仿函数结构体 struct TaskComparator 能够避免侵入污染 Task 原型,在需要不同调度策略(如最急任务先执行 vs 耗时最短先执行)时支持灵活插拔。
3. 移动语义支持
若任务结构体带有大字符串或资源句柄,任务入堆和出堆时应配合 std::move。
完整程序
#include <iostream>
#include <queue>
#include <string>
#include <vector>
struct Task {
int id;
std::string name;
int priority; // 权重:数值越大优先级越高
int timestamp; // 提交时间戳
};
// 自定义调度比较谓词仿函数
struct TaskScheduleComparator {
bool operator()(const Task& a, const Task& b) const {
if (a.priority != b.priority) {
return a.priority < b.priority; // 优先级高的在前(a 小则沉底)
}
return a.timestamp > b.timestamp; // 时间戳小的在前(先来先服务,a 大则沉底)
}
};
int main() {
std::priority_queue<Task, std::vector<Task>, TaskScheduleComparator> scheduler;
// 录入待调度任务
scheduler.push({101, "渲染管线初始化", 5, 100});
scheduler.push({102, "安全漏洞补丁更新", 10, 105});
scheduler.push({103, "后台日志备份", 1, 95});
scheduler.push({104, "高优订单支付对账", 10, 90}); // 与 102 优先级相同,但更早到达
scheduler.push({105, "清理用户临时缓存", 5, 80}); // 与 101 优先级相同,但更早到达
std::cout << "--- 操作系统任务调度出队执行流水 ---\n";
int step = 1;
while (!scheduler.empty()) {
const Task& t = scheduler.top();
std::cout << "[" << step++ << "] 执行任务ID: " << t.id
<< " \t[优先级: " << t.priority << ", 到达时间: " << t.timestamp << "] \t"
<< t.name << "\n";
scheduler.pop();
}
return 0;
}运行示例
输出:
--- 操作系统任务调度出队执行流水 ---
[1] 执行任务ID: 104 [优先级: 10, 到达时间: 90] 高优订单支付对账
[2] 执行任务ID: 102 [优先级: 10, 到达时间: 105] 安全漏洞补丁更新
[3] 执行任务ID: 105 [优先级: 5, 到达时间: 80] 清理用户临时缓存
[4] 执行任务ID: 101 [优先级: 5, 到达时间: 100] 渲染管线初始化
[5] 执行任务ID: 103 [优先级: 1, 到达时间: 95] 后台日志备份