c++完美线程池

以下是一个结合现代C++特性和工业级最佳实践的线程池实现,支持任务返回值、优雅关闭、异常处理和高效资源管理

1

4

6

 

cpp

#include <vector>
#include <queue>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <future>
#include <functional>
#include <stdexcept>
#include <memory>

class ThreadPool {
public:
    explicit ThreadPool(size_t threads = std::thread::hardware_concurrency())
        : stop(false)
    {
        if(threads == 0) throw std::invalid_argument("Thread count cannot be zero");
        
        workers.reserve(threads);
        for(size_t i = 0; i < threads; ++i) {
            workers.emplace_back([this] {
                while(true) {
                    std::function<void()> task;
                    {
                        std::unique_lock<std::mutex> lock(queue_mutex);
                        condition.wait(lock, [this] { 
                            return stop || !tasks.empty(); 
                        });

                        if(stop && tasks.empty()) return;
                        
                        task = std::move(tasks.front());
                        tasks.pop();
                    }

                    try {
                        task();
                    } catch(...) {
                        // 异常处理策略
                        std::exception_ptr eptr = std::current_exception();
                        // 可在此记录日志或执行其他处理
                    }
                }
            });
        }
    }

    template<class F, class... Args>
    auto enqueue(F&& f, Args&&... args) 
        -> std::future<typename std::invoke_result_t<F, Args...>>
    {
        using return_type = typename std::invoke_result_t<F, Args...>;
        
        if(stop) throw std::runtime_error("Enqueue on stopped ThreadPool");

        auto task = std::make_shared<std::packaged_task<return_type()>>(
            std::bind(std::forward<F>(f), std::forward<Args>(args)...)
        );

        std::future<return_type> res = task->get_future();
        {
            std::unique_lock<std::mutex> lock(queue_mutex);
            tasks.emplace([task](){ (*task)(); });
        }
        condition.notify_one();
        return res;
    }

    ~ThreadPool() {
        {
            std::unique_lock<std::mutex> lock(queue_mutex);
            stop = true;
        }
        condition.notify_all();
        for(std::thread &worker : workers) {
            if(worker.joinable()) worker.join();
        }
    }

private:
    std::vector<std::thread> workers;
    std::queue<std::function<void()>> tasks;
    std::mutex queue_mutex;
    std::condition_variable condition;
    bool stop;
};

核心特性说明

1

4

6

  1. 自动硬件并发检测

    • 默认使用std::thread::hardware_concurrency()自动检测CPU核心数
    • 可手动指定线程数量,支持动态调整(需扩展)
  2. 完美转发任务参数

     

    cpp

    template<class F, class... Args>
    auto enqueue(F&& f, Args&&... args)
    • 支持任意可调用对象(函数、lambda、仿函数等)
    • 使用std::bind保持参数类型完整性
  3. 异步返回值处理

    • 通过std::packaged_taskstd::future实现
     

    cpp

    auto res = task->get_future();
    • 允许调用者通过future获取任务执行结果
  4. 异常安全设计

    • 任务执行时的异常捕获机制
     

    cpp

    try {
        task();
    } catch(...) {
        std::exception_ptr eptr = std::current_exception();
    }
    • 可扩展添加异常日志记录或自定义处理逻辑
  5. 优雅关闭机制

     

    cpp

    ~ThreadPool() {
        stop = true;
        condition.notify_all();
        // ...等待线程结束
    }
    • 保证所有已入队任务执行完毕
    • 避免资源泄漏的严格线程join机制

使用示例

6

 

cpp

int main() {
    ThreadPool pool(4); // 4个工作线程
    
    std::vector<std::future<int>> results;
    
    // 提交任务
    for(int i = 0; i < 8; ++i) {
        results.emplace_back(pool.enqueue([i] {
            std::this_thread::sleep_for(std::chrono::seconds(1));
            return i*i;
        }));
    }
    
    // 获取结果
    for(auto&& result : results)
        std::cout << result.get() << ' ';
    
    return 0;
}

高级扩展方向

4

7

  1. 动态线程调整
    可根据队列负载动态增加/减少工作线程

  2. 优先级队列
    使用优先队列实现任务优先级调度

  3. 任务超时机制
    为任务添加超时检测和自动取消功能

  4. 工作窃取算法
    实现work-stealing机制提升负载均衡

  5. 监控统计接口
    添加任务计数、等待时间等监控指标

该实现符合C++11/14/17标准,通过RAII确保资源安全,使用现代模板技术实现类型安全,可作为生产环境基础框架。建议根据具体业务需求进行扩展优化

2

6

。+

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值