码迷,mamicode.com
首页 > 编程语言 > 详细

c++ 11 线程池的简单封装

时间:2018-08-01 14:13:02      阅读:311      评论:0      收藏:0      [点我收藏+]

标签:stat   function   continue   cond   amp   turn   简单   task   get   

#include <condition_variable>
#include <queue>
#include <thread>
#include <vector>

class ThreadPool
{
public:
    ThreadPool(int threads = 4)
        : _stop(false)
    {
        for (int index = 0; index < threads; ++index)
        {
            _workers.emplace_back(std::thread(std::bind(&ThreadPool::threadFunc, this)));
        }
    }

    void addTask(const std::function<void()> &task){
        std::unique_lock<std::mutex> lk(_queueMutex);
        _taskQueue.emplace(task);
        _taskCondition.notify_one();        //唤醒一个线程
    }

    ~ThreadPool()
    {
        {
            std::unique_lock<std::mutex> lk(_queueMutex);
            _stop = true;
            _taskCondition.notify_all();
        }

        for (auto&& worker : _workers) {
            worker.join();
        }
    }

    static ThreadPool* getInstance()
    {
        static ThreadPool instance;
        return &instance;
    }

private:
    void threadFunc()
    {
        while (true) {
            std::function<void()> task = nullptr;
            {
                std::unique_lock<std::mutex> lk(_queueMutex);
                if (_stop)
                {
                    break;
                }
                if (!_taskQueue.empty())
                {
                    task = std::move(_taskQueue.front());
                    _taskQueue.pop();
                }
                else
                {
                    _taskCondition.wait(lk);    //挂起当前线程
                    continue;
                }
            }

            task();
        }
    }

    std::vector<std::thread>  _workers;
    std::queue< std::function<void()> > _taskQueue;

    std::mutex _queueMutex;
    std::condition_variable _taskCondition;
    bool _stop;
};

调用方法:

ThreadPool::getInstance()->addTask([](){
 //do something in thread
});

 

c++ 11 线程池的简单封装

标签:stat   function   continue   cond   amp   turn   简单   task   get   

原文地址:https://www.cnblogs.com/HemJohn/p/9400301.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!