1. 程式人生 > >執行緒池如何管理工作者執行緒

執行緒池如何管理工作者執行緒

1.執行緒池的QueueUserWorkItem方法和Timer類總把工作項放入全域性佇列中

2.工作者執行緒利用先進先出的原則從全域性佇列中取出工作項放入自己的本地佇列中,並處理他們

3.因為多個工作者執行緒要從同時從全域性佇列中取工作項,所以會有一個執行緒同步鎖,保證所有工作者執行緒取出不同的工作項,這個同步鎖在某些應用程式中可能是瓶頸

4.工作者執行緒工作的時候總是先檢查本地佇列查詢Task,採用先進後出的方式重本地佇列中取出,因為自己的佇列所以不用同步鎖,並且因為本地佇列很快所以因為採用先進後出的方式。

5.工作者執行緒發現自己的本地 佇列變空了,會去嘗試從另一個工作者執行緒“偷”一個Task,這個Task是從本地佇列的尾部“偷”走,並加一個同步鎖。這種情況很少發生。

6.如果所有本地佇列都空了,那麼就從全域性佇列獲取工作項

7.全域性佇列也空了,就休息,等待,休息時間太長,會自己醒來,銷燬自己



8.預設情況下,執行緒池工作時建立的執行緒和cpu的核心數是一樣多的,執行緒池會監視工作項的完成速度,如果完成時間太長(具體多長沒有公佈),執行緒池會建立更多的工作者執行緒,如果很快完成,執行緒會銷燬