ThreadPool.h #pragma once #include <iostream> #include<stdlib.h> #include<thread> #include<mutex> #include<condition_variable> #include<vector> #include<functional> #include<queue> #define N 10 using namespace std; class ThreadPool{ public: //自定义void()的函数类型 typedef function<void()>Task; ThreadPool(); ~ThreadPool(); public: size_t initnum; //线程数组 vector<thread>threads ; //任务队列 queue<Task>task ; //互斥锁条件变量 mutex _mutex ; condition_variable cond ; //线程池工作结束时为真 bool done ; //队列是否为空 bool isEmpty ; //队列是否为满 bool isFull; public: void addTask(const Task&f); void start(int num); void setSize(int num); void runTask(); void finish(); };
ThreadPool.cpp #include"ThreadPool.h" ThreadPool ::ThreadPool():done(false),isEmpty(true),isFull(false){ } //设置池中初始线程数 void ThreadPool::setSize(int num){ (*this).initnum = num ; } //添加任务 void ThreadPool::addTask(const Task&f){ if(!done){ //保护共享资源 unique_lock<mutex>lk(_mutex); //要是任务数量到了最大,就等待处理完再添加 while(isFull){ cond.wait(lk); } //给队列中添加任务 task.push(f); if(task.size()==initnum) isFull = true; cout<<"Add a task"<<endl; isEmpty = false ; cond.notify_one(); } } void ThreadPool::finish(){ //线程池结束工作 for(size_t i =0 ;i<threads.size();i++){ threads[i].join() ; } } void ThreadPool::runTask(){ //不断遍历队列,判断要是有任务的话,就执行 while(!done){ unique_lock<mutex>lk(_mutex); //队列为空的话,就等待任务 while(isEmpty){ cond.wait(lk); } Task ta ; //转移控制快,将左值引用转换为右值引用 ta = move(task.front()); task.pop(); if(task.empty()){ isEmpty = true ; } isFull =false ; ta(); cond.notify_one(); } } void ThreadPool::start(int num){ setSize(num); for(int i=0;i<num;i++){ threads.push_back(thread(&ThreadPool::runTask,this)); } } ThreadPool::~ThreadPool(){ }
Test.cpp #include <iostream> #include"ThreadPool.h" void func(int i){ cout<<"task finish"<<"------>"<<i<<endl; } int main() { ThreadPool p ; p.start(N); int i=0; while(1){ i++; //调整线程之间cpu调度,可以去掉 this_thread::sleep_for(chrono::seconds(1)); auto task = bind(func,i); p.addTask(task); } p.finish(); return 0; }
行万里路,不忘初心!