線程池處理部分
續上在這里我將要向大家簡單介紹一下游戲服務器中必須要處理另外一項主要技術:
線程池技術
開始 我來向大家簡單來介紹一下線程池的概念,先簡單了解下線程先,線程可以理解為一個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,而對于具體的工作處理線程池,可以由此模型進行繼承。以此來滿足具體的需要。到這里就簡單的向大家介紹了線程池的處理方式。有不對之處望指正。同時歡迎大家和我交流。