網絡遊戲製作技術(三)

 

線程池處理部分

續上在這裏我將要向大家簡單介紹一下游戲服務器中必須要處理另外一項主要技術:

線程池技術

開始 我來向大家簡單來介紹一下線程池的概念,先簡單瞭解下線程先,線程可以理解爲一個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,而對於具體的工作處理線程池,可以由此模型進行繼承。以此來滿足具體的需要。到這裏就簡單的向大家介紹了線程池的處理方式。有不對之處望指正。同時歡迎大家和我交流。

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章