worksteal thread pool

worksteal的場景

  對於一個線程池,每一個線程有一個隊列,想象這種場景,有的線程隊列中有大量的比較耗時的任務堆積,而有的線程隊列倒是空的,現象就是有的線程處於飢餓狀態,而有的線程處於消化不良的狀態,這時就須要一種方法來解決這個問題。
須要worksteal,顧名思義就是任務竊取,當一個線程處於飢餓狀態時,它就會去其它的線程隊列中竊取任務,解決線程飢餓致使的效率底的問題。 git

worksteal要點

  • 每一個工做線程將任務放到它內部的隊列中;
  • 隊列是一個雙端隊列,支持LIFO的push_front和pop_front操做和FIFO的take操做。
  • 工做線程處理任務經過LIFO來處理最新的任務。
  • 當一個線程處理完了隊列中的任務以後,它會試圖竊取其餘線程隊列的任務,根據FIFO從隊列的尾部取任務。
  • 若是竊取任務失敗則繼續嘗試,直到全部的線程隊列都沒有任務了。

worksteal值得探討的問題

worksteal的適用場景

  worksteal適用場景是任務之間的耗時相差比較大,即有的任務很耗時,有的任務很快完成,這種用worksteal很合適;若是任務的耗時很平均則不適合,由於竊取任務也是須要搶佔鎖的,會形成額外的消耗。 github

竊取任務的策略

  有不少種任務竊取策略,好比從任務最多的線程中竊取或隨機竊取,須要根據實際狀況來選擇。 線程

竊取任務的粒度

  是每次竊取一個任務仍是竊取一批任務也是須要考量的,若是竊取的一批任務比較耗時,又會致使其它線程來竊取,這樣形成了無謂的消耗;若是一次竊取一個任務,而任務很快完成,這又致使從新竊取,下降了效率。這個粒度也是須要根據實際狀況調整的。blog

worksteal thread pool源碼隊列

參考資料get

A Java Fork/Join Framework源碼

Scheduling Multithreaded Computations by Work Stealingit

相關文章
相關標籤/搜索