Skip to content

线程池 ​

c++
#include <thread>
#include <iostream>
#include <atomic>
#include <mutex>
#include <condition_variable>
#include <memory>
#include <queue>
#include <functional>
#include <unistd.h>
class ThreadPool
{
private:
    std::mutex mutex_lock;
    std::condition_variable conditionVal;
    std::atomic_bool isClose;
    std::queue<std::function<void()>> taskQueue;
    int num;

public:
    ThreadPool(int num);
    ~ThreadPool();
    void start();

    template<typename F>
    void addTask(F&& task);
};

ThreadPool::ThreadPool(int num_)
{
    num = num_;
    isClose = false;
}

ThreadPool::~ThreadPool()
{
    isClose = true;
    conditionVal.notify_all();
}

void ThreadPool::start()
{
    for (int i = 0; i < num; i++)
    {
        std::thread([this](){
            //造一个锁  这个锁只是下面用来阻塞自己而已
            std::unique_lock<std::mutex> lock(mutex_lock);
            lock.unlock();
            while(true){
                conditionVal.wait(lock);
                if(!taskQueue.empty()){
                    auto task = std::move(taskQueue.front());
                    taskQueue.pop();
                    mutex_lock.unlock();
                    task();
                }

                mutex_lock.unlock();
                if(isClose){
                    break;
                }

                // 看看关了没有
                if(isClose){
                    mutex_lock.unlock();
                    break;
                }
                // 如果任务队列为空 就阻塞 阻塞前先上锁
                mutex_lock.lock();
                
                if(taskQueue.empty()){
                    std::cout<<std::this_thread::get_id()<<"阻塞\n";
                    conditionVal.wait(lock);
                    mutex_lock.unlock();
                    std::cout<<std::this_thread::get_id()<<"被唤醒\n";
                }
                else {
                    auto task = std::move(taskQueue.front());
                    taskQueue.pop();
                    mutex_lock.unlock();
                    task();
                }
            }

            std::cout<<std::this_thread::get_id()<<"退出\n";
        }).detach();
    }
}

template<typename F>
inline void ThreadPool::addTask(F&& task)
{   
    {
        std::lock_guard<std::mutex> lock(mutex_lock);
        taskQueue.emplace(std::forward<F>(task));
    }
    conditionVal.notify_one();
}

学 习 记 录