当前位置:网站首页>你还不懂线程池的设计及原理吗?掰开揉碎了教你设计线程池
你还不懂线程池的设计及原理吗?掰开揉碎了教你设计线程池
2022-06-11 15:04:00 【InfoQ】
线程池设计思路
线程池是什么

为什么需要线程池
如何设计线程池

【文章福利】另外小编还整理了一些C++后端开发面试题,教学视频,后端学习路线图免费分享,需要的可以自行添加:
学习交流群点击加入~
群文件共享
小编强力推荐C++后端开发免费学习地址:
C/C++Linux服务器开发高级架构师/C++后台开发架构师

设计思路
- 我们需要存放我们创建好的线程,因此我们需要一个容器专门放线程
- 需要一个容器来存放我们的任务,每次把任务放到这个容器里面
- 由于是多线程的读取任务,所以必不可少的我们需要锁,每次读取任务需要加锁和解锁
- 我们需要判断什么时候终止,因此还需要一个判断终止的变量
- 为了避免轮询的判断任务集装箱里面是不是空的,这样效率太低了,因此我们这里采用条件变量
- 将任务添加到线程池中的操作,并且这时应该通知线程可以来取任务来执行了
- 一个循环操作,不断地等待任务集装箱里面有数据来执行,也就是初始化完毕后需要做的事情
- 通过改变终止变量来让上面循环停止的操作
线程池的实现
class CThreadMangerPool
{
public:
CThreadMangerPool(void):is_runing(false){};
bool init(int threadnum);//初始化函数
~CThreadMangerPool(void);
void Run(void); //执行函数
void stop(void); //用来终止循环的函数
void addTask(ThreadTask* task);//向任务集装箱中添加任务的函数
private:
bool CreateThreads(int threadnum = 5);
std::vector<std::shared_ptr<std::thread>> threadsPool; //线程集装箱,用来存放线程
std::list<std::shared_ptr<ThreadTask>> threadTaskList; //任务集装箱,用来存放线程执行的任务
std::condition_variable threadPool_cv; //条件变量
std::mutex threadMutex; //互斥锁
//std::vector<std::shared_ptr<CTcpClient>> tcpClients;
bool is_runing; //终止变量
};void CThreadMangerPool::Run(){
std::shared_ptr<ThreadTask> task;
while(true){ //处在循环中
std::unique_lock<std::mutex> guard(threadMutex);//利用RALL来管理锁,不用手动释放
while(threadTaskList.empty()){ // 这里防止条件变量的虚假唤醒,所以不用if判断
if (!is_runing)
break;
threadPool_cv.wait(guard); //条件变量的使用
}
if (!is_runing) //同上 都是判断如果未启动或者调用了stop函数都会退出循环
break;
task = threadTaskList.front(); //取出任务
threadTaskList.pop_front(); //把任务从容器中拿走
if (task == NULL)
continue;
task->DoIt(); //执行任务处理函数
task.reset(); //重置指针
}
}void CThreadMangerPool::addTask(ThreadTask* task){
std::shared_ptr<ThreadTask> ptr; //创建一个指向任务的智能指针
ptr.reset(task);
{
std::lock_guard<std::mutex> guard(threadMutex); //同样是用RALL来管理锁,免去手动释放
threadTaskList.push_back(ptr); //往任务集装箱中添加任务
}
threadPool_cv.notify_all(); //通知线程可以执行了,就是唤醒刚才在条件变量处睡眠的条件
}参考资料
边栏推荐
- 【Azure 应用服务】NodeJS Express + MSAL 实现API应用Token认证(AAD OAuth2 idToken)的认证实验 -- passport.authenticate()
- In depth analysis of "circle group" relationship system design | series of articles on "circle group" technology
- 19. Insertion et suppression d'un arbre de recherche binaire
- Hashicopy之nomad应用编排方案03(运行一个job)
- 详解 Kubernetes 包管理工具 Helm
- 19. 二叉搜索樹的插入删除修剪
- 树莓派知识大扫盲
- Oauth2的理解
- Small open source projects based on stm32f1
- 如何做好自媒体?这几个步骤你做对了吗?
猜你喜欢

Uniapp settings page Jump effect - navigateto switching effect - Global animationtype animation

C # - how to add and read appsetting in the console application JSON file

Webgl programming guide learning (0)

Qualcomm WLAN framework learning (29) -- 6GHz overview

111. minimum depth of binary tree

高数_第6章无穷级数__马克劳林级数

腾讯面试官分享面试经验,如何考察面试者技术及个人综合素质,给正在面试的你一点建议

你违规了吗?

深度剖析「圈组」关系系统设计 | 「圈组」技术系列文章

Analyse approfondie de la conception du système relationnel du Groupe de cercles
随机推荐
腾讯面试官分享面试经验,如何考察面试者技术及个人综合素质,给正在面试的你一点建议
Sum of two leetcode numbers
Individual income tax rate table
Flutter 3.0正式发布:稳定支持6大平台,字节跳动是主要用户
树莓派获得网络安装系统功能,无需借助其他设备
Implementation of gray-scale publishing scheme for microservice architecture based on gateway and Nacos
Hashicopy之nomad应用编排方案03(运行一个job)
In depth analysis of "circle group" relationship system design | series of articles on "circle group" technology
C language simple webserver
Did you break the rules?
Illustration of tiger international quarterly report: revenue of USD 52.63 million continued to be internationalized
111. minimum depth of binary tree
Simple C language address book
Lippon instrument software intern interview
【Azure 应用服务】NodeJS Express + MSAL 实现API应用Token认证(AAD OAuth2 idToken)的认证实验 -- passport.authenticate()
Avenue to simplicity | how to configure self attention for vit is the most reasonable?
Hashicopy之nomad应用编排方案05(访问web页面)
数据库“百亿蓝海”中,每位玩家都能找到一叶扁舟 | C位面对面
简单的C语言版本通讯录
Leetcode daily question - plus one