線程池

線程池  ： 一種線程使用模式 。 線程過多會帶來調度開銷 ， 進而影響緩存局部性和整體性能 。 而線程池維護着多個線程 ， 等待着監督管理者分配可併發執行的任務 。 這避免了在處理短時間任務時創建與銷燬線程的代價 。 線程池不僅能夠保證內核的充分利用 ， 還能防止過分調度 。 可用線程數量應該取決於可用的併發處理器 、 處理器內核 、 內存 、 網絡sockets等的數量 。 例如 ， 對於計算密集型任務 ， 線程數一般取cpu數量 +2 比較合適 ， 線程數過多會導致額外的線程切換開銷 。 任務調度以執行線程的常見方法是使用同步隊列 ， 稱作任務隊列 。 池中的線程等待隊列中的任務 ， 並把執行完的任務放入完成隊列中 。 線程池模式一般分爲兩種 ： HS / HA半同步 / 半異步模式 、 L / F領導者與跟隨者模式 。 半同步 / 半異步模式又稱爲生產者消費者模式 ， 是比較常見的實現方式 ， 比較簡單 。 分爲同步層 、 隊列層 、 異步層三層 。 同步層的主線程處理工作任務並存入工作隊列 ， 工作線程從工作隊列取出任務進行處理 ， 如果工作隊列爲空 ， 則取不到任務的工作線程進入掛起狀態 。 由於線程間有數據通信 ， 因此不適於大數據量交換的場合 。 領導者跟隨者模式 ， 在線程池中的線程可處在3種狀態之一 ： 領導者leader 、 追隨者follower或工作者processor 。 任何時刻線程池只有一個領導者線程 。 事件到達時 ， 領導者線程負責消息分離 ， 並從處於追隨者線程中選出一個來當繼任領導者 ， 然後將自身設置爲工作者狀態去處置該事件 。 處理完畢後工作者線程將自身的狀態置爲追隨者 。 這一模式實現複雜 ， 但避免了線程間交換任務數據 ， 提高了CPU cache相似性 。 在ACE ( Adaptive Communication Environment ) 中 ， 提供了領導者跟隨者模式實現 。 線程池的伸縮性對性能有較大的影響 。 創建太多線程 ， 將會浪費一定的資源 ， 有些線程未被充分使用 。 銷燬太多執行緒 ， 將導致之後浪費時間再次創建它們 。 創建線程太慢 ， 將會導致長時間的等待 ， 性能變差 。 銷燬執行緒太慢 ， 導致其它執行緒資源飢餓 。