一个简洁版的线程池
去除了minthreadnum,maxthreadnum进一步控制线程数目的功能
只是实现维持一定数量线程,在有任务时唤醒去执行的简单逻辑。
#include <iostream>
#include <mutex>
#include <queue>
#include <thread>
#include <condition_variable>
#include <cassert>
#include <windows.h>
using namespace std;
int num=0;
class ThreadPool{
public:
explicit ThreadPool(size_t threadCount=8):pool_(std::make_shared<Pool>()){//将其转换为share_ptr
assert(threadCount>0);
for (size_t i = 0; i < threadCount; i++)//创建工作线程
{
std::
thread([pool = pool_]//参数为pool,pool为share_ptr
{
std::unique_lock<std::mutex> locker(pool->mtx);//开始无任务时,所有线程都阻塞
while(true){//循环判断
if(!pool->Q.empty()){//有任务则处理
auto task=std::move(pool->Q.front());
pool->Q.pop();
locker.unlock();//阻塞-》活跃
task();//工作
locker.lock();//工作完再阻塞
}else if(pool->isClosed) break;//关闭则破循环,线程不再循环检测任务队列
else pool->cond.wait(locker);//无任务,任务来临时,notify_one会唤醒一个
} })
.detach();//子线程就可以和主线程分离,当子线程退出的时候,其占用的内核资源就被系统的其他进程接管并回收了。线程分离之后在主线程中使用 pthread_join() 就回收不到子线程资源了
}
}
ThreadPool()=default;
ThreadPool(ThreadPool &&)=default;
~ThreadPool(){
if(static_cast<bool>(pool_)){//关闭池子
{
std::lock_guard<std::mutex> locker(pool_->mtx);
pool_->isClosed=true;
}
pool_->cond.notify_all();//把任务都做完
}
}
template <typename F>
void AddTask(F &&task){//把任务加入队列
{//对Q保护
std::lock_guard<std::mutex> locker(pool_->mtx);
pool_->Q.emplace(std::forward<F>(task));//完美转发
}
pool_->cond.notify_one();//条件变量唤醒一个
}
private:
typedef struct Pool{
std::mutex mtx;//线程池互斥量
std::condition_variable cond;//条件变量
bool isClosed;//关闭线程池
std::queue<std::function<void()>> Q;//任务队列
Pool(){}
}Pool;
std::shared_ptr<Pool> pool_;//共享指针
};
void taskFunc(void* arg){
int num=*(int*)arg;
cout<<"thread is working,number="<<num<<endl;
}
int main(){
ThreadPool pool(8);
for(int i=0;i<100;i++)
pool.AddTask(std::bind(&taskFunc,&num));
pthread_exit(NULL);
return 0;
}