Linux下的C語言線程池

    線程池的目的是爲了減少線程創建、銷燬所帶來的代價,當有非常多的任務需要獨立的線程去做時,可以使用線程池,從線程池中獲取線程來處理一個個任務。

    本文就來實現一個線程池。實現環境爲Linux操作系統,採用C語言實現pthread線程的線程池。


基本方法如下幾點:

  • pthread線程
  • 構造雙向鏈表維持待完成任務隊列
  • 使用線程信號量sem_t控制線程池
  • 使用線程互斥鎖pthread_mutex_t保護任務隊列

設計思路:

    線程池狹義將其實是若干個組成的數組,如果是靜態數組,那麼線程個數保持不變;如果是動態數組,那麼可以讓線程的個數隨着任務量需求的變化而變化。線程一旦創建就不再銷燬,而是一直存在,當要處理任務時就需要調用對應的任務;當沒有任務時就阻塞起來。

    任務由隊列組織起來,形成一個任務隊列,採用先入先出的優先處理原則。

    線程池的主線程負責創建線程池中的子線程、添加新任務。子線程負責從任務隊列中摘取任務來執行。


線程分配設計:

    線程池中的每個子線程都是等價的。我們用線程信號量來控制子線程和任務的分配問題。設置一個信號量來表示任務隊列中的任務資源。每個子線程都會處於死循環中,每輪循環首先等待一個任務資源信號量,當等到之後,互斥地從任務隊列中摘取一個任務結點,任務結點中記錄着該任務所要執行的函數指針及其參數。之後子線程開始執行該任務。執行完之後釋放一個信號量並進入下一輪循環。當沒有信號量小於1時,子線程將會阻塞。

    因此一個任務由哪一個線程來執行,這要看哪個線程能夠獲取到對應的信號量資源。


具體實現:

    任務隊列由雙向鏈表構造,每個節點包含一個任務的函數指針和參數指針。

typedef struct thpool_job_t{

    void*  (*function)(void* arg);    

    void*                     arg;    

    struct thpool_job_t*     next;   

    struct thpool_job_t*     prev;  

}thpool_job_t;
    任務隊列擁有一個任務資源信號量,用來控制線程的分配。

typedef struct thpool_jobqueue{

    thpool_job_t *head;          

    thpool_job_t *tail;         

    int           jobsN;        

    sem_t        *queueSem;                            

}thpool_jobqueue;
    線程池的結構體,記錄了線程數組、線程個數、任務隊列。
typedef struct thpool_t{

    pthread_t*       threads;   

    int              threadsN;   

    thpool_jobqueue* jobqueue;   

}thpool_t;

實現細節:點擊這裏

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