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