• 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
    
  • 相关阅读:
    9.20-9.21学习内容
    轮播图案例
    一个封装函数的实现过程
    9.18-9.19学习内容
    事件捕获和事件冒泡
    9.17学习内容
    appendChild()方法遇到的问题
    9.15学习内容
    9.16学习内容
    通过端口检测远程服务器是否开启,如果没有开启开启本地替代服务脚本
  • 原文地址:https://www.cnblogs.com/HachikoT/p/14027013.html
Copyright © 2020-2023  润新知