c++实现一个线程池,首先需要有两个数据结构,一个是线程池,一个是任务队列。为了每个线程线程安全的从任务队列里面拿任务,还需要带一个线程同步的锁。
线程池的基本框架: 线程池的基本框架 main函数: main函数线程池的核心代码:
//第一步,启动线程池里面的函数,每个线程去执行threadWork 函数
void start() {
if (!isRuning) {
this->isRuning = true;
for (int i = 0; i < threadNum; i++) {
thread * th = new thread(&ThreadPool::threadWork,this);
threads.push_back(th);
}
cout << "ThreadPool is running " << endl;
return;
}
}
// threadWork 函数在在任务队列 为空的情况下是一个阻塞的状态,
// 如果线程池的任务队列不为空,那么执行一个任务
void threadWork() {
cout << "threadWork" << endl;
function<void(void)> task = NULL;
while (isRuning) {
{
std::lock_guard<std::mutex> guard(this->m_); //类 lock_guard 是互斥封装器 , 锁离开作用域时自动释放
if (Task_list.empty()) {
condition_empty_.wait(this->m_); //等待有任务到来被唤醒
}
if (!Task_list.empty())
{
task = Task_list.front(); //从任务队列中获取最开始任务 // typedef std::function<void(void)> Task;
Task_list.pop_front(); //将取走的任务弹出任务队列
}
else {
continue;
}
task(); //执行任务函数
} //释放锁
}
}
网友评论