C++线程池

一、什么是线程池?

线程池(Thread Pool) 是一种预先创建并维护若干线程的并发编程模型,所有任务提交后由池内线程处理,避免频繁创建销毁线程带来的系统开销。

线程池核心理念:

  • 资源复用:复用固定数量的线程处理大量短时任务

  • 控制并发:防止线程数无控制增长导致内存耗尽或CPU调度崩溃

  • 任务排队:合理调度和管理任务执行顺序


二、线程池原理架构

线程池包含三大核心模块:

  1. 任务队列(Task Queue):存储待处理的任务

  2. 固定数量的工作线程(Worker Threads):循环从队列中取任务执行

  3. 线程管理器(ThreadPool):负责启动、停止线程和任务调度

运行流程:

+-----------------+      +---------------------+      +--------------------+
|  外部提交任务   | ---> |   线程池任务队列     | ---> |  工作线程执行任务    |
+-----------------+      +---------------------+      +--------------------+

三、线程池的优势

优势

说明

降低开销

线程复用,避免频繁创建和销毁系统线程,减少CPU和内存开销

控制并发

限制最大线程数量,避免线程数无限增长导致系统资源耗尽(OOM)

提升响应速度

空闲线程可立即响应新任务,避免线程创建延迟

支持任务排队

任务可进入队列,按顺序或策略处理

易于扩展和管理

可增加任务拒绝策略、定时任务、优先级队列等机制


四、线程池的适用场景

  • 高并发网络服务器(Web Server / RPC Server)

  • 大量短任务的异步并发处理

  • IO密集型或计算密集型任务分离调度

  • 限制资源场景下的并发控制(如嵌入式)


五、C++ 线程池优化示例代码(完整可运行)

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

class ThreadPool {
public:
    explicit ThreadPool(size_t num_threads) : stop(false) {
        // 创建固定数量的工作线程
        for (size_t i = 0; i < num_threads; ++i) {
            workers.emplace_back([this]() {
                while (true) {
                    std::function task;
                    { // 加锁取任务
                        std::unique_lock lock(this->queue_mutex);
                        this->condition.wait(lock, [this]() { 
                            return this->stop || !this->tasks.empty(); 
                        });
                        if (this->stop && this->tasks.empty())
                            return;
                        task = std::move(this->tasks.front());
                        this->tasks.pop();
                    }
                    // 执行任务
                    task();
                }
            });
        }
    }

    // 提交任务
    template
    void enqueue(F&& f, Args&&... args) {
        auto task = std::bind(std::forward(f), std::forward(args)...);
        {   // 线程安全加入任务队列
            std::unique_lock lock(queue_mutex);
            if (stop)
                throw std::runtime_error("enqueue on stopped ThreadPool");
            tasks.emplace(task);
        }
        condition.notify_one(); // 唤醒一个线程
    }

    // 线程池销毁,等待线程退出
    ~ThreadPool() {
        {   
            std::unique_lock lock(queue_mutex);
            stop = true;
        }
        condition.notify_all();
        for (std::thread &worker : workers) {
            if (worker.joinable())
                worker.join();
        }
    }

private:
    std::vector workers;           // 工作线程集合
    std::queue> tasks;    // 任务队列
    std::mutex queue_mutex;                    // 队列互斥锁
    std::condition_variable condition;         // 条件变量控制线程唤醒
    std::atomic stop;                    // 停止标志
};

// 示例任务
void example_task(int n) {
    std::cout << "Task " << n << " is running in thread "
              << std::this_thread::get_id() << std::endl;
}

int main() {
    ThreadPool pool(4); // 创建包含4个线程的线程池

    // 提交10个任务
    for (int i = 0; i < 10; ++i) {
        pool.enqueue(example_task, i);
    }

    std::this_thread::sleep_for(std::chrono::seconds(2)); // 模拟主线程其他操作
    std::cout << "Main thread exits." << std::endl;
    return0;
}

六、线程池优化亮点(C++版设计要点)

  • 固定线程数设计:避免线程无上限增长,防止 OOM

  • 任务队列(Blocking Queue):提交任务后,线程自动取出执行

  • 智能调度(Condition Variable):避免忙等,提升性能

  • 线程安全:锁+条件变量保证多线程下安全

  • RAII 自动回收:析构自动等待所有线程退出,防止资源泄漏


线程池作为现代并发编程中的核心模型,具备以下优势:

  • 极大提升多任务处理的性能

  • 避免线程爆炸和内存泄漏风险

  • 适用于各种高并发、异步、资源受限场景

你可能感兴趣的:(c++,开发语言)