記linux下對執行緒池的學習及使用(一)

2021-09-12 07:06:37 字數 965 閱讀 8245

執行緒池就是乙個擁有許多執行緒的乙個容器,通常執行緒池中的執行緒可通過條件量設定為休眠狀態,待到條件改變即執行緒池發現了新的可執行任務的時候,會隨機喚醒乙個等待執行緒從任務佇列中提取任務並且執行。

如果沒有執行緒池,可以假想在乙個服務端在要處理的事件的時候,大概可分為三步,分別是

1.建立執行緒 2.執行緒執行具體任務 3.銷毀執行緒。如果處理的具體任務是乙個很簡單的任務,那麼第一步和第3步無疑就會影響服務端對整個事件的處理效率。

再分析有執行緒池的情況,執行緒池中預先休眠了20個執行緒,當然這將占用小部分記憶體,但是當事件來臨時,服務端只需喚醒休眠的執行緒,被喚醒的執行緒在執行完任務後通過乙個迴圈再次進入休眠狀態。那麼就大大節省可建立和銷毀執行緒的時間,這是一種以空間換時間的方式,對服務端效能有了乙個不錯的提公升。

構建乙個執行緒池,需要:

1.任務鍊錶 (用來儲存任務)

2.條件量,互斥量等(用來高效保護臨界資源)

3.乙個主線程(執行緒池中的所有執行緒都會跑這個主線程,主線程內部呼叫條件量的wait函式,使自身休眠)

4.管理執行緒池的介面 (包括增減執行緒,新增任務喚醒執行緒等)

1.初始化最大,最小執行緒數等基本引數

2.初始化條件量,互斥量等

3.初始化任務佇列

##3.執行緒池的執行流程

初始化執行緒池、任務鍊錶和工作執行緒->向任務鍊錶中新增任務->將等候在條件變數(任務鍊錶上有任務)上的乙個執行緒喚醒並從該任務佇列中取出第乙個任務給該執行緒執行->等待主程序關閉->關閉執行緒池。

前面已經提到,任務需要用乙個任務鍊錶儲存,那麼在此封裝乙個任務類基類,將任務抽象出來,留下run虛函式給派生類過載,使得執行緒池與具體任務區分開來

#ifndef _task_h

#define _task_h

class ctask

virtual ~ctask(){}

virtual int run()=0;

};#endif

Linux下建立執行緒池

執行緒入口函式 void function entry void arg 2.程序退出 if pool flag 0 3.建立工作 printf the pthread will to work ox x n pthread self 判斷是否滿足條件 assert pool work num 0 ...

android中對執行緒池的理解與使用

先給大家給兩個連線 這篇帖子總結了android中如何具體的使用executorservice 這邊帖子總結了executorservice中不同的執行緒池類別及使用規則 執行緒池中處理執行緒的類別較多如 限制按順序來執行任務的執行緒池 乙個乙個任務的執行執行緒池 按指定個數來執行任務的執行緒池 建...

linux執行緒池學習(一)

關於標頭檔案pthread.h內主要函式及引數學習 1.pthread create函式 函式宣告 int pthread create pthread t restrict tidp,const pthread attr t restrict attr,void start rtn void vo...