執行緒池小結

2021-09-10 06:15:22 字數 2563 閱讀 4332

生產者消費者模型

執行緒池簡單實現

首先按照國際慣例先上概念,概念來自維基百科:

執行緒池(英語:thread pool):一種執行緒使用模式。執行緒過多會帶來排程開銷,進而影響快取區域性性和整體效能。而執行緒池維護著多個執行緒,等待著監督管理者分配可併發執行的任務。這避免了在處理短時間任務時建立與銷毀執行緒的代價。執行緒池不僅能夠保證核心的充分利用,還能防止過分排程。可用執行緒數量應該取決於可用的併發處理器、處理器核心、記憶體、網路sockets等的數量。 例如,執行緒數一般取cpu數量+2比較合適,執行緒數過多會導致額外的執行緒切換開銷。

執行緒池模式一般分為兩種:hs/ha半同步/半非同步模式、l/f領導者與跟隨者模式。

執行緒池就是有一堆執行緒的池子,在有任務的時候,執行緒池就會排隊從任務佇列中取任務並執行。那麼為什麼需要執行緒池呢?舉個例子:

http伺服器中有很多連線請求,這些連線請求如果每次來,主線程都建立乙個執行緒來執行任務,那麼在這個過程中,執行緒不斷被建立不斷被銷毀,而且乙個http請求往往會被分為多個部分請求,如果請求一多,建立銷毀的過程儘管很快,但是當這個過程的數量級上來了,那麼將會耗費大量資源,執行緒池的存在就是為了解決這個建立和銷毀的過程中所消耗的大量資源問題。

也就是說如果有執行緒池,那麼大量建立銷毀執行緒的這個過程就可以省去,當併發極高的時候,執行緒池可以緩解一定壓力。

之前面試的時候有問到乙個問題就是執行緒池的數量一般有幾個,當時沒有答出來,維基百科給出了答案,執行緒數一般取 cpu數量+2 比較合適,但是光有式子沒有說服力,不過查閱其他資料發現其並不全對。

一句兩句講不完整,主要說說我的理解,具體可以看魏小言的關於執行緒池數量討論的這篇部落格

一般乙個程式可以分為cpu密集型(又叫計算密集型)和io密集型,計算密集型就是cpu一直算的那種程式,而io密集型則是需要經常讀寫的程式,這個時候執行緒池的數量不能一概而論:

因此執行緒池中線程的數量不是固定的,有看到設定為2倍的,也有看到設定為8倍甚至更多的。

但可以肯定的是,這個數量是有上限的,如果執行緒池中線程數量過多,對cpu排程也是一種負擔,cpu排程切換也需要時間,反而會引起效能下降的問題,還有乙個問題就是執行緒太多,但是根本用不完,導致資源浪費嚴重。

解耦的方式為,生產者不直接給消費者通知,而是將資源放入乙個佇列,而消費者也不直接問生產者要資源,只問佇列要資源,解耦後的生產者消費者結構不像之前那麼緊密結合,而是各自管各自的工作,中間介入了乙個佇列充當中介的身份收取和提供臨界資源。

執行緒池中目前實現兩個類,乙個是task類,也就是任務,任務很簡單,就是列印一句話,另乙個則是執行緒池的類threadpool類,負責執行緒的統一管理,由於實現的非常簡單,需要注意的就是同步與互斥問題以及任務分配需要注意的問題。

直接上**,**中看的更清楚

#include

#include

#include

#include

typedef

void

(*handlefunction)

(void*)

;// 等會要做的任務

void

print

(void

* arg)

class task

// 過載()實現仿函式

void

operator()

()private:

handlefunction f;};

class threadpool

~threadpool()

// 執行緒池初始化建立5個執行緒

void

initthreadpool()

}// 執行緒初始化完畢之後都要分離自己,並等待任務

static

void

*threadrotinue

(void

* arg)

task t = tp->

gettask()

; tp->

taskpop()

; tp->

unlockqueue()

;t()

;}}// 任務排隊

void

taskpush

(task& t)

void

lockqueue()

void

unlockqueue()

void

threadidle()

void

wakeupthread()

bool queueisempty()

task gettask()

void

taskpop()

private:

int thread_nums;

int idle_nums;

std:

:queue task_queue;

pthread_mutex_t lock;

pthread_cond_t cond;};

intmain()

return0;

}

實現的比較簡單,如果有錯誤或不足,還請及時指正。

執行緒池小結(一)

executors jdk1.5之後的乙個新類,提供了一些靜態工廠,生成一些常用的執行緒池,threadpoolexecutor是executors類的底層實現 1.newsinglethreadexecutor 建立乙個單執行緒的執行緒池。這個執行緒池只有乙個執行緒在工作,也就是相當於單執行緒序列...

執行緒 執行緒池

執行緒池是一種多執行緒處理形式,處理過程中將任務新增到佇列,然後在建立執行緒後執行,主要實現 建立執行緒和管理執行緒,並且給執行緒分配任務。執行緒池中的執行緒是併發執行的。乙個比較簡單的執行緒池至少應包含執行緒池管理器 工作執行緒 任務列隊 任務介面等部分。其中執行緒池管理器的作用是建立 銷毀並管理...

執行緒 執行緒池

乙個簡單執行緒的建立和銷毀如下 與程序程序相比,執行緒是一種輕量級的工具,但是輕量並不代表沒有,它的建立和關閉依然需要花費時間,如果建立和銷毀的時間還大於執行緒本身完成的工作,那就會得不償失,甚至會造成out of memory。即使沒有,大量的執行緒 也會給gc帶來巨大的壓力。為了解決這樣的問題,...