美文网首页C++Linux
C++ 实现线程池

C++ 实现线程池

作者: 爱秋刀鱼的猫 | 来源:发表于2018-04-26 15:27 被阅读161次

    c++实现一个线程池,首先需要有两个数据结构,一个是线程池,一个是任务队列。为了每个线程线程安全的从任务队列里面拿任务,还需要带一个线程同步的锁。

    线程池的基本框架: 线程池的基本框架 main函数: main函数

    线程池的核心代码:

        //第一步,启动线程池里面的函数,每个线程去执行threadWork 函数
        void start() {
            if (!isRuning) {
                this->isRuning = true;
                for (int i = 0; i < threadNum; i++) {
                    thread * th = new thread(&ThreadPool::threadWork,this);
                    threads.push_back(th);
                }
                cout << "ThreadPool is running " << endl;
                return;
            }
        }
    
        // threadWork 函数在在任务队列 为空的情况下是一个阻塞的状态,
        // 如果线程池的任务队列不为空,那么执行一个任务
        void threadWork() {
            cout << "threadWork" << endl;
            function<void(void)>  task = NULL;
            while (isRuning) {
                {
                    std::lock_guard<std::mutex> guard(this->m_);    //类 lock_guard 是互斥封装器 , 锁离开作用域时自动释放
    
                    if (Task_list.empty()) {
                        condition_empty_.wait(this->m_);  //等待有任务到来被唤醒
                    }
                    if (!Task_list.empty())
                    {
                        task = Task_list.front();  //从任务队列中获取最开始任务   // typedef std::function<void(void)> Task;
                        Task_list.pop_front();     //将取走的任务弹出任务队列
                    }
                    else {
                        continue;
                    }
                    task();  //执行任务函数
                } //释放锁
            }
        }
    
    源码:

    https://github.com/GreenGitHuber/code_something

    相关文章

      网友评论

        本文标题:C++ 实现线程池

        本文链接:https://www.haomeiwen.com/subject/gejulftx.html