立篇 计划17年1月22日完成 本来计划1月完成的文章 整整晚了一个月也是醉了
这几天看代码越发对框架的设计与实现感兴趣,业务的抽象化、模块化不停的在脑子里打转 ,可是执行代码的最终还是CPU而线程是CPU的调度单位,单线程早已不能满足软件行业的需求,多线程情况下CPU会浪费很多时间在线程调度上,线程池适当的使用可以大幅减少CPU的调度时间从而提升软件性能,本片文章意在从线程池的简介、实现机制等方面来掌握使用线程池
1、线程池的简介
线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动处理这些任务。----这句话摘自百度百科,这句话比较精简的概括了线程池的定义以及工作方式。
线程池是一种多线程处理形式:上边也大致描述了技术发展中线程池诞生的原因,线程池其实是多线程处理形式之一,但比普通的多线程做了更多的优化在底层做了很多额外的工作如创建及销毁、调度线程。
处理过程中将任务添加到队列:开发者仅需要调用线程池的函数接口向线程的任务队列里抛任务,也就是线程池底层维护着一个有锁队列,初始化后创建的线程在得到CPU后不断的请求任务来执行任务
2、线程池的使用
这里以Windows提供的一个线程池结构CThreadPool为例来描述线程大致使用步骤,包含头文件#include <atlutil.h>下边是Win头文件中
template <class Worker, class ThreadTraits=DefaultThreadTraits, class WaitTraits=DefaultWaitTraits>
class CThreadPool : public IThreadPoolConfig
{
//省略定义
};
CThreadPool定义可以看出该数据结构是一个模版类其中需要我们实现线程Worker类,Worker类需要实现以下几个接口:
class CMyWorker
{
public:
typedef MyRequestType RequestType;//任务类型
BOOL Initialize(void* pvWorkerParam);//线程初始化操作,指针是在线程池初始化的时候传进来的
void Execute(MyRequestType request, void* pvWorkerParam, OVERLAPPED* pOverlapped);//当有任务时执行的线程函数
void Terminate(void* pvWorkerParam);//线程结束时会调用该函数
};