Linux(服務器編程):35---簡略版的線程池設計(pthreadPool)

一、設計線程池的優點、作用

  • 線程使應用能夠更加充分合理的協調利用cpu 、內存、網絡、i/o等系統資源
  • 線程的創建需要開闢虛擬機棧,本地方法棧、程序計數器等線程私有的內存空間
  • 在線程的銷燬時需要回收這些系統資源。頻繁的創建和銷燬線程會浪費大量的系統資源,增加併發編程的風險
  • 另外,在服務器負載過大的時候,如何讓新的線程等待或者友好的拒絕服務?這些丟失線程自身無法解決的。所以需要通過線程池協調多個線程,並實現類似主次線程隔離、定時執行、週期執行等任務

二、線程池的設計

  • 本線程池比較簡單,就包括3個內容:

    • 任務節點
    • 線程節點
    • 線程池

任務節點

  • 功能:就是一個任務,其有一個回調函數,用於執行任務
  • 特點:管當有新任務加入線程池之後,這個任務會被線程池分配給線程去處理
//任務節點
typedef struct NJOB
{
    void (*_jobFunc)(void *NJOB); //回調函數
    void *_userData;              //回調函數參數

    struct NJOB *_next;
    struct NJOB *_prev;
}NJOB;

線程節點

  • 功能:單個線程的表示結構體,可以用來處理任務
  • 特點:線程各自運行在自己的pthread_create()回調函數中,一直不間斷的執行任務
//線程節點
typedef struct NWORKER
{
    pthread_t _tid;                //線程節點的tid
    struct NWORKQUEUE *_workQueue; //該線程所屬的線程池

    int _terminate;      //是否終止工作
    
    struct NWORKER *_next;
    struct NWORKER *_prev;
}NWORKER;

線程池

  • 功能:線程池對象,保存着任務和所有的線程
//線程池(管理着所有的任務和線程節點)
typedef struct NWORKQUEUE
{
    struct NJOB    *_jobs;
    struct NWORKER *_workers;

    int _sumWorkersNum;  //總共的線程數
    int _freeWorkersNum; //空閒的線程數
    
    pthread_mutex_t _mutex; //互斥鎖
    pthread_cond_t  _cond;  //條件變量
}NWORKQUEUE;

typedef NWORKQUEUE threadPool;

三、編程實現

  • Github開源地址:https://github.com/dongyusheng/pthreadPool
  • 該代碼是兩種線程池的實現方式,pthread_pool2目錄是本文介紹的代碼,pthread_pool1是前面文章(參閱文章開頭鏈接)介紹的線程池的實現。因此本文的代碼對應的是pthread_pool2目錄下的源碼

運行:

  • 進入pthread_pool2目錄後輸入make編譯,然後運行pthread_pool2_miain程序

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