题目

编写程序,模拟操作系统的多优先级任务调度器。设计结构体 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] 	后台日志备份