天天看點

線程池

我們應該設計通用的線程池,那麼該怎麼設計呢,其實就是通過回調函數,将線程函數和參數都用void*來表示,這樣使用者可以定義自己的回調函數,而參數的話可以放在結構體裡面,這樣每個客戶都可以使用該線程池來調用自己的函數,并且可以傳遞多個入參。

顧名思義,就是多個線程事先已經建立好了,放在一個池子裡,當有需要的時候拿來用,不需要的時候還到池子裡去。

第一,可以實作代碼的重用,不必每次都去調用線程api來實作;

第二,減少資源的損耗,避免了頻繁的建立和銷毀線程所帶來的資源損耗;

第三,友善管理,我們可以根據機器情況來決定啟多少個線程,并且可以知道哪個線程正在使用,哪個沒有被使用;

假定一個線程就是一個任務的話,線程池就是多個任務放入一個隊列,需要的時候我們啟動這個任務,不需要的時候,停止這個任務,并且會有一個标志來表示任務是啟動還是停止狀态。

例如:

空間和線程事先已經初始化好,需要執行任務時,修改執行标志,傳入函數指針和參數指針,執行,執行完畢後又放入未使用隊列;

在此過程中需用到互斥鎖和條件變量,每個子線程在執行完任務後,會阻塞在條件變量那裡,一旦主線程有任務的話,就通過條件變量通知到子線程,子線程就會重新啟動,開始執行;

一個簡單線程池結構設計如下:

線程池設計:

限制最多能起多少個線程

初始化起指定數量的線程,讓他們處于等待狀态,當有任務來時将任務傳遞給線程進行處理

當啟動線程數量超過最大值時再有任務來要麼拒絕要麼放入隊列等待

使用單例模式,一個程式中隻會有一個線程池,同時寫一組接口管理線程池執行個體

當有任務時,隊列中空閑線程數量變少

當任務完成時,釋放相應的線程

繼續閱讀