• 简易线程池实现(C++)


    #include <vector>
    #include <queue>
    #include <thread>
    #include <functional>
    #include <mutex>
    using namespace std;
    
    class ThreadPool {
    public:
        static const int InitThreadsSize = 3; // 线程池大小
        typedef function<void()> Task;
    
        ThreadPool(); // 构造函数
        ~ThreadPool(); // 析构函数
        void start(); // 启动线程池,创建一定数量的线程,进行线程循环
        void stop(); // 终止线程池,停止所有线程循环,回收所有资源
        void addTask(const Task&); // 向任务队列中添加任务
    
    private:
        void threadLoop(); // 进行线程循环
        Task take(); // 从任务队列中取任务
    
        typedef vector<std::thread*> Threads; 
        typedef vector<Task> Tasks;
        Threads m_threads; // 线程数组
        Tasks m_tasks; // 任务队列 m_tasks
        mutex m_mutex; // 互斥锁
        condition_variable m_cond; // 条件变量
        bool m_isStarted; // 线程池启动标志位
    };
    
    
    // 构造函数
    ThreadPool::ThreadPool():m_mutex(),m_cond(),m_isStarted(false) {}
    
    // 析构函数
    ThreadPool::~ThreadPool() {
        if (m_isStarted) stop(); // 终止线程池
    }
    
    // 启动线程池
    void ThreadPool::start() {
        m_isStarted = true; // 启动标志位
        m_threads.reserve(InitThreadsSize); // 为线程数组预留空间
        for (int i = 0; i < InitThreadsSize; ++i) {
            // 新建线程并添加到线程数组中
            m_threads.push_back(new thread(bind(&ThreadPool::threadLoop, this)));
        }
    }
    
    // 终止线程池
    void ThreadPool::stop() {
        {
            unique_lock<mutex> lock(m_mutex);
            m_isStarted = false;
            m_cond.notify_all(); // 通知所有等待线程,线程池已经终止
        }
        for (Threads::iterator it = m_threads.begin(); it != m_threads.end(); ++it) {
            (*it)->join(); // 阻塞进程直到线程执行完毕
            delete* it;
        }
        m_threads.clear();
    }
    
    // 进行线程循环
    void ThreadPool::threadLoop() {
        while (m_isStarted) {
            // 从任务队列中取出线程并运行
            Task task = take();
            if (task) task();
        }
    }
    
    // 向任务队列中添加任务
    void ThreadPool::addTask(const Task& task) {
        unique_lock<mutex> lock(m_mutex);
        m_tasks.push_back(task);
        m_cond.notify_all(); // 通知所有等待线程从任务队列中取任务
    }
    
    // 从任务队列中取任务
    ThreadPool::Task ThreadPool::take() {
        unique_lock<std::mutex> lock(m_mutex);
        while (m_tasks.empty() && m_isStarted) {
            // 调用wait函数解锁
            // 被唤醒后加锁
            m_cond.wait(lock);
        }
        Task task;
        if (!m_tasks.empty() && m_isStarted)
        {
            task = m_tasks.back();
            m_tasks.pop_back();
        }
        return task;
    }

    参考链接 https://www.cnblogs.com/ailumiyana/p/10016965.html

  • 相关阅读:
    山丽防水墙客户端的卸载
    还原冰点密码清除
    STP学习总结
    NTFS权限设置时卡死
    SQL server 2000安装时“以前的某个程序安装已在安装计算机上创建挂起”
    Projecet客户端登陆无法通过验证
    Linux-nftables
    Linux-kernel-timeline
    blog编辑技巧
    Linux-swap
  • 原文地址:https://www.cnblogs.com/yongjin-hou/p/15204047.html
Copyright © 2020-2023  润新知