云计算百科
云计算领域专业知识百科平台

手写一个 C++11 线程池(完整源码 + 原理详解)

说明:

 源码已托管至Github:https://github.com/gaici666/C-11-Thread.git

线程学习整合包:通过网盘分享的文件:Project 链接: https://pan.baidu.com/s/1pK1fSWuk9KasBf151y5K9A?pwd=sikj 提取码: sikj

一、线程池整体结构设计

线程池主要包含:

线程数组(vector<thread>)

任务队列(queue<function<void()>>)

互斥锁(mutex)

条件变量(condition_variable)

停止标志(stop)

线程模型如下:

工作线程不断循环:

  • 加锁

  • 等待任务

  • 取出任务

  • 解锁

  • 执行任务

  • 二、完整代码实现

    1. 线程池类实现

    #include <iostream>
    #include <mutex>
    #include <thread>
    #include <string>
    #include <condition_variable>
    #include <queue>
    #include <vector>
    #include <functional>

    using namespace std;

    class ThreadPool {
    public:
    // 构造函数,创建指定数量的线程
    ThreadPool(int numThreads) : stop(false) {
    for (int i = 0; i < numThreads; i++) {
    threads.emplace_back([this]() {
    while (1) {
    std::unique_lock<std::mutex> lock(this->mtx);

    condition.wait(lock, [this]() {
    return !tasks.empty() || stop;
    });

    if (stop && tasks.empty()) {
    return;
    }

    std::function<void()> task =
    std::move(this->tasks.front());
    tasks.pop();

    lock.unlock();

    task();
    }
    });
    }
    }

    // 析构函数
    ~ThreadPool() {
    {
    std::unique_lock<std::mutex> lock(mtx);
    stop = true;
    }

    condition.notify_all();

    for (auto& t : threads) {
    t.join();
    }
    }

    // 添加任务
    template<class F, class… Args>
    void enqueue(F&& f, Args&&… args) {

    std::function<void()> task =
    std::bind(std::forward<F>(f),
    std::forward<Args>(args)…);

    {
    std::unique_lock<std::mutex> lock(mtx);
    tasks.emplace(std::move(task));
    }

    condition.notify_one();
    }

    private:
    std::vector<std::thread> threads;
    std::queue<std::function<void()>> tasks;

    std::mutex mtx;
    std::condition_variable condition;

    bool stop;
    };

    2. 测试代码

    void work(int i) {
    std::cout << "Task: " << i << " is running\\n";
    std::this_thread::sleep_for(std::chrono::seconds(2));
    std::cout << "Task: " << i << " is done\\n";
    }

    int main() {
    ThreadPool pool(4);

    for (int i = 0; i < 10; i++) {
    pool.enqueue(work, i);
    }

    return 0;
    }

    三、总结

    本线程池实现了:

    线程复用

    任务排队执行

    条件变量同步

    完美转发

    安全析构退出

    这是 C++ 并发编程的核心基础模型。

    如果你能熟练掌握:

    1.mutex

    2.condition_variable

    3.完美转发

    4.lambda 捕获

    那么线程池基本原理就已经完全掌握。

    赞(0)
    未经允许不得转载:网硕互联帮助中心 » 手写一个 C++11 线程池(完整源码 + 原理详解)
    分享到: 更多 (0)

    评论 抢沙发

    评论前必须登录!