- 在前面的文章(https://blog.csdn.net/qq_41453285/article/details/99708377)中我們設計過了一種線程池,但是那種線程池比較複雜代碼比較多,本文介紹一個簡略版的線程池
一、設計線程池的優點、作用
- 線程使應用能夠更加充分合理的協調利用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程序