实战:为ThreadPool添加超简单任务优先级功能
你是否遇到过线程池任务执行顺序混乱的问题?关键任务被低优先级任务阻塞,导致程序响应缓慢?本文将通过5个简单步骤,教你为轻量级C++11 ThreadPool添加任务优先级功能,让任务调度更高效!读完本文你将学到:如何修改任务结构体、实现优先级队列、调整线程池接口、更新工作逻辑以及编写测试示例。
原理解析:线程池工作流程
ThreadPool项目是一个基于C++11的轻量级线程池实现,核心文件为ThreadPool.h。原实现使用std::queue存储任务,任务按添加顺序执行,无法区分优先级。
步骤1:定义优先级任务结构体
首先需要修改任务存储结构,在ThreadPool.h中添加带优先级的任务结构体:
// 在ThreadPool类内部或外部定义
struct PriorityTask {
int priority; // 优先级值,数字越大优先级越高
std::function<void()> func; // 任务函数
// 重载比较运算符,用于优先级队列排序
bool operator<(const PriorityTask& other) const {
return priority < other.priority; // 小顶堆,优先级高的先执行
}
};
步骤2:修改任务队列类型
将原有的std::queue替换为std::priority_queue,在ThreadPool.h第25行修改:
// 原代码
std::queue< std::function<void()> > tasks;
// 修改为
std::priority_queue<PriorityTask> tasks;
步骤3:更新任务添加接口
修改enqueue方法,添加优先级参数,在ThreadPool.h第62-84行:
// 修改函数声明,添加priority参数
template<class F, class... Args>
auto enqueue(int priority, F&& f, Args&&... args)
-> std::future<typename std::result_of<F(Args...)>::type> {
// ... 原有代码 ...
// 修改任务添加方式
tasks.emplace(PriorityTask{
priority,
[task](){ (*task)(); }
});
// ... 原有代码 ...
}
步骤4:调整工作线程逻辑
修改工作线程的任务获取逻辑,确保从优先级队列中取任务执行,在ThreadPool.h第41-56行:
// 原代码
task = std::move(this->tasks.front());
this->tasks.pop();
// 修改为
task = std::move(this->tasks.top().func);
this->tasks.pop();
步骤5:编写测试示例
修改example.cpp,添加不同优先级的任务测试:
#include <iostream>
#include <vector>
#include <chrono>
#include "ThreadPool.h"
int main() {
ThreadPool pool(2); // 创建2个工作线程
std::vector<std::future<int>> results;
// 添加不同优先级的任务
results.emplace_back(pool.enqueue(1, [] { // 低优先级
std::this_thread::sleep_for(std::chrono::seconds(1));
return 1;
}));
results.emplace_back(pool.enqueue(3, [] { // 高优先级
return 3;
}));
results.emplace_back(pool.enqueue(2, [] { // 中优先级
return 2;
}));
// 输出结果,应按3、2、1顺序返回
for(auto && result: results)
std::cout << result.get() << ' ';
std::cout << std::endl;
return 0;
}
测试验证:优先级效果展示
编译运行修改后的程序,高优先级任务会优先执行,即使它是后添加的。执行结果应输出3 2 1,证明优先级调度生效。
总结与扩展
通过以上5个步骤,我们成功为ThreadPool添加了任务优先级功能。核心修改包括定义优先级结构体、使用优先级队列、更新接口和工作逻辑。你可以进一步扩展:添加动态调整优先级、实现优先级范围限制或添加任务取消功能。
鼓励读者动手实践这些修改,体验优先级调度带来的灵活性提升。如有疑问,可参考项目README.md或查看源代码注释。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



