一種執行緒使用模式。執行緒過多會帶來排程開銷,進而影響快取區域性性和整體效能。而執行緒池維護著多個執行緒,等待著監督管理者分配可併發執行的任務,即在程式初始化時,建立一定數量的執行緒(又最大限制),從任務佇列中獲取任務,進行處理
執行緒池=至少乙個執行緒+任務佇列
作用:
1.避免為大量請求建立執行緒,導致瞬間資源耗盡程式崩潰的問題
2.避免大量執行緒頻繁建立銷毀所帶來的時間成本
執行緒池的應用場景:
1.需要大量的執行緒來完成任務,且完成任務的時間比較短。 web伺服器完成網頁請求這樣的任務,使用線 程池技術是非常合適的。因為單個任務小,而任務數量巨大,但對於長時間的任 務,比如乙個telnet這樣會話時間比執行緒的建立時間長的多的任務,執行緒池的優點就不明顯了
2. 對效能要求苛刻的應用,比如要求伺服器迅速響應客戶請求。
3. 接受突發性的大量請求,但不至於使伺服器因此產生大量執行緒的應用
執行緒池的實現:
1.建立固定數量的執行緒,建立執行緒安全的任務佇列
2.迴圈從任務佇列中獲取任務物件,執行任務物件中的任務介面和資料
**框架
//任務類
typrdef void(*handler_t)(int data)//函式指標
class task
run()
}
//執行緒池類
class threadpool
簡單實現
#include #include #include typedef void (*handler_t)(int data);//定義函式指標
class task
//給執行緒池的所有執行緒提供統一的介面
void run()
private:
int _data;
handler_t _handler;
};#define thr_max 5
class threadpool
~threadpool()
//建立執行緒
bool poolinit()
pthread_detach(tid);//將退出的執行緒的資源自動**
}return true;
}//入隊任務
bool taskpush(task &t)
//出隊任務
bool taskpop(task &t)
//執行緒入口函式
static void *thr_start(void *arg)
task t;
pool->taskpop(t);
pool->queueunblock();
//需要先解鎖再處理任務,否則其他執行緒無法處理任務,喪失併發性
t.run();
}return null;
}//執行緒池的退出,等所有任務處理完畢才退出,不能直接return 0
void poolquit()
queueunblock();
while(_cur_thr>0)
} public:
void queueblock()
void queueunblock()
//執行緒陷入等待之前需要先判斷使用者是否要退出
void consumerwait()
pthread_cond_wait(&_con_cond,&_mutex);
} void consumerwakeup()
bool queueisempty()
private:
int _thr_max;//最大執行緒數量
std::queue_task_queue;//任務佇列
bool _quit_flag;//設定乙個標誌,在flag為true時,所有執行緒被喚醒並退出
int _cur_thr;//當前執行緒池的執行緒數量
pthread_mutex_t _mutex;
pthread_cond_t _pro_cond;
pthread_cond_t _con_cond;
};int main ()
執行緒池實現原理
上面這幅圖作者表達的不夠完整,作者想通過如下文本來表達內含本質。過程如下 如果請求執行緒小於執行緒池目標執行緒,則執行緒池會新建立執行緒來處理請求 如果請求執行緒數過多,超過了目標執行緒則將請求任務放入佇列中進行緩衝 如果佇列滿了 但未達到最大執行緒池數,這時會新建立執行緒 直到上限為止即maxpo...
執行緒池實現原理
蘑菇街面試,設計乙個執行緒池 入隊非阻塞佇列 當佇列中滿了時候,放入資料,資料丟失 阻塞佇列 當佇列滿了的時候,進行等待,什麼時候佇列中有出隊的資料,那麼第11個再放進去 出隊非阻塞佇列 如果現在佇列中沒有元素,取元素,得到的是null 阻塞佇列 等待,什麼時候放進去,再取出來 執行緒池使用的是阻塞...
Java執行緒池實現原理
threadpoolexecutor是jdk提供的執行緒池實現,threadpoolexector實現了execturo介面,可以自動幫助使用者建立,銷毀和保護執行緒,先來看一下最基本的使用方式 建立乙個執行緒池final executor executor new threadpoolexecut...