线程池---C11新特性

#include<iostream>
#include<thread>
#include<vector>
#include<queue>
#include<functional>
#include<mutex>
#include<condition_variable>
#include<string>
class ThreadPool{
public:
    ThreadPool(int numThread):stop(false){
        for(int i=0;i<numThread;i++){
            threads.emplace_back([this]{
                 while(1){
                    std::unique_lock<std::mutex>lock(mtx);
                    if(stop&&tasks.empty()) return ;
                    
                    condition.wait(lock,[this]{return !tasks.empty()||stop;});
                    std::function<void()>task(std::move(tasks.front()));
                    tasks.pop();
                    lock.unlock();
                    task();
                 }
            });
        }
    }
    ~ThreadPool(){
        {
            std::unique_lock<std::mutex>lock(mtx);
            stop=true;
        }
        condition.notify_all();
        for(auto& t:threads){
            t.join();
        } 
    }
    template<class F,class... Args>
    void enqueue(F&&f,Args&&... args){
        std::function<void()>task=std::bind(std::forward<F>(f),std::forward<Args>(args)...);
        std::unique_lock<std::mutex>lock(mtx);
        tasks.emplace(move(task));
        condition.notify_one();
    }

private:
  std::vector<std::thread>threads;
  std::queue<std::function<void()>>tasks;
  std::condition_variable condition;
  std::mutex mtx;
  bool stop;
};

int main(){
    ThreadPool pool(1);
    for(int i=0;i<10;i++){
        pool.enqueue([i]{
            std::cout<<"task: "<<i<<std::endl;
            std::this_thread::sleep_for(std::chrono::seconds(1));
            std::cout<<"task :"<<i<<" is done!"<<std::endl;
        });
    }
    return 0;
}
posted @ 2025-09-02 21:39  流光最璀璨i  阅读(7)  评论(0)    收藏  举报