记linux下对线程池的学习及使用(一)

什么是线程池

线程池就是一个拥有许多线程的一个容器,通常线程池中的线程可通过条件量设置为休眠状态,待到条件改变即线程池发现了新的可执行任务的时候,会随机唤醒一个等待线程从任务队列中提取任务并且执行。

为什么需要线程池

如果没有线程池,可以假想在一个服务端在要处理的事件的时候,大概可分为三步,分别是
1.创建线程 2.线程执行具体任务 3.销毁线程。如果处理的具体任务是一个很简单的任务,那么第一步和第3步无疑就会影响服务端对整个事件的处理效率。
再分析有线程池的情况,线程池中预先休眠了20个线程,当然这将占用小部分内存,但是当事件来临时,服务端只需唤醒休眠的线程,被唤醒的线程在执行完任务后通过一个循环再次进入休眠状态。那么就大大节省可创建和销毁线程的时间,这是一种以空间换时间的方式,对服务端性能有了一个不错的提升。

线程池框架分析

1. 线程池的需求分析

构建一个线程池,需要:
1.任务链表 (用来存储任务)
2.条件量,互斥量等(用来高效保护临界资源)
3.一个主线程(线程池中的所有线程都会跑这个主线程,主线程内部调用条件量的wait函数,使自身休眠)
4.管理线程池的接口 (包括增减线程,添加任务唤醒线程等)

2.线程池的初始化

1.初始化最大,最小线程数等基本参数
2.初始化条件量,互斥量等
3.初始化任务队列

##3.线程池的运行流程
 初始化线程池、任务链表和工作线程->向任务链表中添加任务->将等候在条件变量(任务链表上有任务)上的一个线程唤醒并从该任务队列中取出第一个任务给该线程执行->等待主进程关闭->关闭线程池。

任务基类封装

前面已经提到,任务需要用一个任务链表存储,那么在此封装一个任务类基类,将任务抽象出来,留下run虚函数给派生类重载,使得线程池与具体任务区分开来

#ifndef _TASK_H
#define _TASK_H
class CTask
{
public:
	CTask(){}
	virtual ~CTask(){}
	virtual int run()=0;
};
#endif
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值