執行緒池中如何確定執行緒的數目

2021-08-08 11:31:58 字數 892 閱讀 8267

我用c寫了乙個執行緒池,但是在寫的時候沒有考慮執行緒池中線程的數目,當初直接隨便設定了乙個執行緒的數目。

但是在面試時,將常被問到如何設定執行緒池中線程的數目的?

我也在網上了搜了一些資料,今天在這裡就說一下「如何設定執行緒池中線程的數目?」

執行緒池中線程的數目是跟執行緒池所要處理的任務性質有關的

任務的性質:cpu密集型任務、io密集型任務、混合型任務。

任務的優先順序:高、中、低。

任務的依賴性:是否依賴其他系統資源,如資料庫連線等。

性質不同的任務可以交給不同規模的執行緒池執行。

針對不同的任務性質而言:

cpu密集型任務應配置盡可能小的執行緒,如配置cpu個數+1的執行緒數,io密集型任務應配置盡可能多的執行緒,因為io操作不占用cpu,不要讓cpu閒下來,應加大執行緒數量,如配置兩倍cpu個數+1,而對於混合型的任務,如果可以拆分,拆分成io密集型和cpu密集型分別處理,前提是兩者執行的時間是差不多的,如果處理時間相差很大,則沒必要拆分了。

任務對其他系統資源有依賴:如某個任務依賴資料庫的連線返回的結果,這時候等待的時間越長,則cpu空閒的時間越長,那麼執行緒數量應設定得越大,才能更好的利用cpu。 

執行緒等待時間所佔比例越高,這樣的話cpu空閒時間比較多,為了能夠更好的利用cpu,需要較多執行緒。

如果執行緒cpu時間所佔比例越高,說明cpu比較繁忙,此時

需要越少執行緒。

另外,如果執行緒數量過多,執行緒之間的切換也會帶來開銷。

是否使用執行緒池就一定比使用單執行緒高效呢?

答案是否定的,比如redis就是單執行緒的,但它卻非常高效,基本操作都能達到十萬量級/s。從執行緒這個角度來看,部分原因在於:多執行緒帶來執行緒上下文切換開銷,單執行緒就沒有這種開銷。

執行緒池中如何確定執行緒的數目

簡單點計算 cpu密集型 cpu 1 io密集型 2 cpu 1 任務依賴性同混合型 針對不同的任務性質而言 cpu密集型任務應配置盡可能小的執行緒,如配置cpu個數 1的執行緒數,io密集型任務應配置盡可能多的執行緒,因為io操作不占用cpu,不要讓cpu閒下來,應加大執行緒數量,如配置兩倍cpu...

執行緒池中的執行緒何時死亡?

runworker this gettask 其他介紹 面試被問到了,結果說的不清楚。回來看了下。檢視從workqueue中gettask,當非core執行緒空閒時間超過keepalivetime,timeunit指定的時間後,則退出 ps 超過空閒時間退出這個我是知道的,但是當時本能的認為不是問的...

執行緒池中的柵欄

多執行緒中有三個類,分別是countdownlatch,cyclicbarrier,semaphore。代表著執行緒中的柵欄。共享鎖。在一組執行緒中,乙個執行緒等待其他執行緒。我把它理解為門栓。檢視該類的資料結構圖如下圖一 圖一 有乙個靜態的內部類,sync繼承自aqs。使用例子 如下 classn...