先舉個簡單的例子:
我們在想吃魚的時候,會先去超市買魚,但是這樣的結果就是,浪費時間。
我們可以在超市買好魚,放在家裡魚缸,等想吃的時候,直接從魚缸裡面取一條,這樣做就節省了大量的時間。
執行緒池:優點:
我們知道執行緒生命週期可以劃分為三個階段,執行緒的建立階段,執行緒的執行階段,執行緒的銷毀階段。執行緒池的優點就是先將執行緒建立出來,等執行緒使用完後,再將其放入到執行緒池中,這樣大大節省了時間開銷。
大量執行緒+任務佇列
大量執行緒到底是多少呢?
可能會有人認為,執行緒池裡面的執行緒應該越多越好,其實不是這樣的,執行緒越多,則執行緒之間排程,切換的成本更大,反而導致執行效率降低。
舉乙個簡單的例子:魚缸就這麼大,你不能因為自己喜歡吃魚,就將這個魚缸放滿魚吧。
所以有乙個不成文的規定:執行緒的個數應該是cpu核心數+1。這樣做最大程度上使用cpu處理效率。
注意事項:我們在建立執行緒的時候,需要給定乙個執行緒處理函式,但是如果我們建立多個執行緒時,用的是同乙個執行緒處理函式,則會導致,建立的執行緒只能處理同乙個問題,無法處理多個問題,因為,我們在建立執行緒的時候,需要使用者給出執行緒的處理函式。
* 實現執行緒池
*/#include
#include
#include
#include
#include
#include
using
namespace std;
typedef
void
(*task_func_t)
(int arg)
;//訊息處理類
class
threadtask
threadtask
(int
&data,task_func_t func)
:_data
(data)
,_func
(func)
void
settask
(int
&data,task_func_t func)
void
run(
)//完成資料處理的函式
private
:int _data;
//訊息
task_func_t _func;
//訊息處理函式};
#define max_thread 5
class
threadpool
pthread_detach
(pid)
;//分離執行緒}}
~threadpool()
bool
taskpush
(const threadtask &task)
void
queuelock()
bool
isempty()
void
threadwait()
void
taskpop
(threadtask *task)
void
queueunlock()
private
:int max_thread;
//執行緒的數量
std::queue _queue;
//任務佇列
pthread_mutex_t _mutex;
//實現互斥
pthread_cond_t _cond_pth;
//執行緒池的等待佇列
//由於該執行緒建立函式為類成員函式,類成員函式預設有乙個this指標,所以將其設定為static函式
//設定成static函式,就不能訪問類內部成員,所以需要對類內部成員進行分裝
static
void
*thread_func
(void
*arg)
threadtask task;
pool-
>
taskpop
(&task)
; pool-
>
queueunlock()
; task.
run();
//通過run介面完成資料的處理
}return
null;}
};void
tast
(int data)
intmain()
return0;
}
Linux執行緒池的實現
執行緒池是執行緒的一種使用模式,是管理和利用多執行緒處理多工的一種方法。解決的問題 當執行緒過多時,會帶來排程開銷,進而影響整體效能 執行緒池維護多個執行緒,等待管理者分配可併發執行的任務 避免處理短時間任務時,建立和銷毀執行緒的代價。執行緒池可以保證核心的充分利用,防止過分排程。執行緒池中的執行緒...
linux下執行緒池的實現(c )
2012 12 07 16 11 44 分類 電子安防專案 舉報 字型大小訂閱 參考 autoptr.h created on 2012 12 7 author kym 智慧型指標模板 ifndef autoptr h define autoptr h include template class ...
執行緒池的實現
為什麼要使用執行緒池 因為執行緒的建立和銷毀佔了大量的cpu等系統資源,使用執行緒池可以解決這種情況,提高伺服器的效能。執行緒池的思想 1 先在記憶體中開闢出一些數目固定的執行緒。2 當請求到達時,從執行緒池中選擇乙個空閒的執行緒來服務,服務完成時,執行緒放入執行緒池。3 當請求到答時,將請求放到任...