实战:为ThreadPool添加超简单任务优先级功能

实战:为ThreadPool添加超简单任务优先级功能

【免费下载链接】ThreadPool A simple C++11 Thread Pool implementation 【免费下载链接】ThreadPool 项目地址: https://gitcode.com/gh_mirrors/th/ThreadPool

你是否遇到过线程池任务执行顺序混乱的问题?关键任务被低优先级任务阻塞,导致程序响应缓慢?本文将通过5个简单步骤,教你为轻量级C++11 ThreadPool添加任务优先级功能,让任务调度更高效!读完本文你将学到:如何修改任务结构体、实现优先级队列、调整线程池接口、更新工作逻辑以及编写测试示例。

原理解析:线程池工作流程

ThreadPool项目是一个基于C++11的轻量级线程池实现,核心文件为ThreadPool.h。原实现使用std::queue存储任务,任务按添加顺序执行,无法区分优先级。

mermaid

步骤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,证明优先级调度生效。

mermaid

总结与扩展

通过以上5个步骤,我们成功为ThreadPool添加了任务优先级功能。核心修改包括定义优先级结构体、使用优先级队列、更新接口和工作逻辑。你可以进一步扩展:添加动态调整优先级、实现优先级范围限制或添加任务取消功能。

鼓励读者动手实践这些修改,体验优先级调度带来的灵活性提升。如有疑问,可参考项目README.md或查看源代码注释。

【免费下载链接】ThreadPool A simple C++11 Thread Pool implementation 【免费下载链接】ThreadPool 项目地址: https://gitcode.com/gh_mirrors/th/ThreadPool

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值