初探NetGame(三):线程池处理
续上在这里我将要向大家简单介绍一下游戏服务器中必须要处理另外一项主要技术:
线程池技术
开始 我来向大家简单来介绍一下线程池的概念,先简单了解下线程先,线程可以理解为一个function , 是一个为了进行某一项任务或者处理某一项具体事务的函数。例如:
UINT WINAPI FunctionCtrl(void *) //线程处理函数
{
进行某一项任务或者处理某一项具体事务
………….
return EXITFUNCTION_CODE; //退出码
}
而我们的线程池自身可以理解为是很多线程的一个管理者也可以说是一个很多线程的统筹者。因为我们的线程池具有生成线程功能也具有撤消线程的权利。这就是简单的线程池的概念(我的理解,呵呵!!)接下来就来具体介绍线程池了!!
首先 介绍我们为什么要使用线程池技术呢?大家都知道我们的游戏服务器端要处理大量的用户请求,,同时需要发送大量的游戏数据到客户端,从而来驱动客户端程序的执行和维持游戏的进行。那我们的服务器端是如何进行处理的呢?其实在这里我们就充分用到了线程池技术。
那么用这种技术有什么好处和优点呢?以下就来简述这些,有不足之处和不当之处希望有心人指正,呵呵!!
大家都了解在我们服务器整个运行过程中,我们将整个运行时间分成很多个时间片。而对于这些已经分成的各个微小的时间片而言,在各个不同时间片中要处理的用户请求和需要发送到用户端的游戏数据量也将是不一样的。而处理用户的请求和发送数据到客户端的工作都是由一系列的线程来执行的。
鉴于上面,这样我们就可以感性的设想下服务器运行中的两种情况:
第一种在我们服务器运行到某个时间片需要处理大量的用户请求和发送大量数据,有这样繁重的工作任务,我们就需要有很多的工作者线程来处理完成这样的任务,以此来满足我们的工作需要。这样说我们就必须拥有很多工作者线程。
第二种在我们服务器运行到某个时间片需要处理的用户请求和发送数据工作量比较小,由于任务比较少,我们用来处理任务的工作者线程也就不需要很多。也就是说我们只要有少量的工作者线程就可以达到我们的工作要求了。
对于上面的两种情况,我们可以说明这样的一个事实,也就是说我们服务器在运行过程中运行状态是动态改变的,呼忙呼闲,时急时慢的。服务器的这样的行为动作和性质可以做一个如下比喻:服务器就是一个企业,在企业业务非常忙的时候,公司的员工数量就必须要增多来满足业务的需要。而在企业不景气的时候,接的业务也就比较少,那么来说就会有很多员工比较闲。那我们该怎么办呢?为了不浪费公司资源和员工自身资源,我们就必须要裁减员工,从而来配合公司的运行。而做这样工作的可能是公司的人力资源部或者其他部分。现在就认为是人力资源部了。呵呵。
对于上面的比喻我们来抓几个关键词和列举关键词和我们主题对象进行对照,以此来帮大家来简单理解服务器运行和线程池。
企业 : 游戏服务器
人力资源部 : 线程池
职员 : 工作者线程
在说了这么多的废话后,就具体的将线程池模型 ThreadPool.h文件提供以供大家参考:
class GThreadPoolModel
{
friend static UINT WINAPI PoolManagerProc(void* pThread); //线程池管理线程
friend static UINT WINAPI WorkerProc (void* pThread); //工作者线程
enum SThreadStatus //线程池状态
{
BUSY,
NORMAL,
IDLE
};
enum SReturnvalue //线程返回值
{
MANAGERPROC_RETURN_value = 10001,
WORKERPROC_RETURN_value = 10002,
…………….
};
public:
GThreadPoolModel ();
virtual ~ GThreadPoolModel ();
virtual bool StartUp(WORD static_num,WORD max_num)=0; //启动线程驰
virtual bool Stop(void )=0; //停止线程池
virtual bool ProcessJob(void *)=0; //提出工作处理要求
protected:
virtual bool AddNewThread(void )=0; //增加新线程
virtual bool DeleteIdleThread(void)=0; //删除空闲线程
static UINT WINAPI PoolManagerProc (void* pThread); //线程池管理线程
static UINT WINAPI WorkerProc (void* pThread); //工作者线程
GThreadPoolModel::SThreadStatus GetThreadPoolStatus( void ); //获取线程池当前工作状态
private:
void Init();
void Release();
protected:
………………………..
private:
};
以上是线程池模型的一个简单class,而对于具体的工作处理线程池,可以由此模型进行继承。以此来满足具体的需要。到这里就简单的向大家介绍了线程池的处理方式。