執行緒池
那麼,**怎麼去實現呢?
#include
#include
#include
#include
//定義了handler
//handler的型別是函式指著型別
//然後就可以去定義變數了
//所定義出來的變數的型別其實就是函式指標型別變數
//返回值為void型別為int的引數都是符合條件的
typedef
void
(*handler)
(int);
//我們首先需要給出佇列中元素的類
class queuedata
//析構函式
//不用做什麼事情
//也沒有什麼記憶體需要去釋放,所以就什麼也不做了
~queuedata()
//備註是掉的**其實也可以完成我我們所希望完成的功能
//但是呼叫的介面太多了,使用起來有些麻煩
//所以我們不採用這種方式來進行使用
#if 0
handler gethanler()
intgetdata()
handler get
(int
* data)
#endif
//在這個函式中,用我們自己的成員變數去初始化我們的資料其實就是可以的
void
run(
)
private:
//執行緒池裡面
//應該首先先含有乙個變數
//然後含有對這個變數的處理方式
int data_;
//給出函式入口處的位址
handler handler_;};
//寫完上面的類之後,資料型別可以首先告一段落
class threadpool
~threadpool()
//因為是執行緒來進行pop的操作的
//但是現在還沒有執行緒,所以我們要給出執行緒池中線程的初始化的操作
intoninit()
}//如果建立執行緒成功的話,那麼我就返回0就好了
//建立執行緒失敗的話,就在上面的位置返回1
return0;
}int
push
(queuedata* qd)
que_.
push
(qd)
;pthread_mutex_unlock
(&lock_)
;pthread_cond_signal
(&cons_cond_)
;return0;
}void
threadexit()
private:
void
pop(queuedata*
* qd)
//因為這是類傳遞過來的成員函式,所以說是一定要加上static的
static
void
*poolstart
(void
* arg)
//pos 3 pcb等待佇列 ==> no
pthread_cond_wait
(&tp->cons_cond_,
&tp->lock_);}
//pos 4 ==> no
queuedata* qd;
tp->
pop(
&qd)
;pthread_mutex_unlock
(&tp->lock_)
;//pos 5 ==> no
qd->
run();
delete qd;}}
private:
//對於執行緒池我們首先需要考慮的就是執行緒安全佇列
std:
:queue> que_;
size_t capacity_;
//互斥鎖和條件變數
//這個鎖是用來對佇列進行保護的
pthread_mutex_t lock_;
//但是其實我們可以讓主線成來充當生產線程
//可以去讓主線程進行push的操作
//那麼,其實我們現在就可以不需要生產線程了,畢竟執行緒池所要解決的問題其實也是如何去消費執行緒的問題
//pthread_cond_t prod_cond_;
pthread_cond_t cons_cond_;
//執行緒的數量個數
//應該要告訴出來你到底有多少個執行緒
int thread_count_;
int flag;};
void
dealdata
(int data)
intmain()
int ret = tp->
oninit()
;if(ret <0)
for(
int i =
0; i <
100; i++
) tp->
push
(qd);}
sleep(10
);tp->
threadexit()
; delete tp;
return0;
}
多執行緒 執行緒池
第一 降低資源消耗。通過重複利用已建立的執行緒降低執行緒建立和銷毀造成的消耗。第二 提高響應速度。當任務到達時,任務可以不需要等到執行緒建立就能立即執行。第三 提高執行緒的可管理性。執行緒是稀缺資源,如果無限制地建立,不僅會消耗系統資源,還會降低系統的穩定性,使用執行緒池可以進行統一分配 調優和監控...
多執行緒 執行緒池
執行緒池是什麼 執行緒池 thread pool 是一種基於池化思想管理執行緒的工具,經常出現在多執行緒伺服器中,如mysql。執行緒過多會帶來額外的開銷,其中包括建立銷毀執行緒的開銷 排程執行緒的開銷等等,同時也降低了計算機的整體效能。執行緒池維護多個執行緒,等待監督管理者分配可併發執行的任務。這...
多執行緒 執行緒池
執行緒池的作用 減少了每次建立 銷毀執行緒所帶來的損耗。執行緒池建立執行緒的簡易流程 文字描述 1 先判斷核心執行緒池 corepoolsize 是否已滿,沒滿就建立核心執行緒執行,滿了就進行下一判斷。2 判斷等待佇列 workqueue 是否已經滿了,沒滿就新增到等待佇列,滿了就進行下一判斷。3 ...