執行緒池原理 具體實現

2021-09-26 03:55:23 字數 2185 閱讀 2937

一種執行緒使用模式。執行緒過多會帶來排程開銷,進而影響快取區域性性和整體效能。而執行緒池維護著多個執行緒,等待著監督管理者分配可併發執行的任務,即在程式初始化時,建立一定數量的執行緒(又最大限制),從任務佇列中獲取任務,進行處理

執行緒池=至少乙個執行緒+任務佇列

作用:

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...