C++ 线程池

C++ 线程池

基于C++11语法实现的简易线程池:

/**
 * 线程池(C++简单实现)
 * @file: ThreadPool.h
 * @author: rancheng <rc4work@163.com>
 * @date: 2020-11-23
 */
#pragma once

#include <vector>
#include <queue>
#include <memory>
#include <utility>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <functional>

namespace dev {

class ThreadPool {
public:
    using SP = std::shared_ptr<ThreadPool>;

    // 创建线程池
    explicit ThreadPool(unsigned threadNum) {
        // 创建线程
        for (unsigned i = 0; i < threadNum; ++i) {
            m_pool.emplace_back([this] {
                while (true) {
                    // 取出任务出来执行
                    std::function<void()> task;
                    {
                        std::unique_lock<std::mutex> lock(m_mutex);
                        m_cv.wait(lock, [this] { return !m_runFlag || !m_taskQueue.empty(); });
                        if (!m_runFlag) {
                            // 停止运行了
                            return;
                        }
                        task = std::move(m_taskQueue.front());
                        m_taskQueue.pop();
                    }
                    task();
                }
            });
        }
    }

    // 析构函数
    ~ThreadPool() {
        {
            std::lock_guard<std::mutex> guard(m_mutex);
            m_runFlag = false;
        }
        m_cv.notify_all();
        for (auto& t : m_pool) {
            t.join();
        }
    }

    // 添加任务
    template <class F>
    void enqueue(F&& f) {
        {
            std::lock_guard<std::mutex> guard(m_mutex);
            m_taskQueue.push(std::forward<F>(f));
        }
        m_cv.notify_one();
    }

private:
    // 线程池
    std::vector<std::thread> m_pool;

    // 同步变量
    std::mutex m_mutex;
    std::condition_variable m_cv;

    // 任务队列
    std::queue<std::function<void()>> m_taskQueue;

    // 运行标志
    bool m_runFlag = true;
};

}   // namespace dev
posted @ 2020-11-23 20:57  HachikoT  阅读(508)  评论(0编辑  收藏  举报