1. 程式人生 > >演算法:工作竊取演算法(work-stealing)。

演算法:工作竊取演算法(work-stealing)。

工作竊取演算法是指某個執行緒從其他佇列裡竊取任務來執行。那麼,為什麼需要使用工作竊取演算法呢?假如我們需要做一個比較大的任務,可以把這個任務分割為若干互不依賴的子任務,為了減少執行緒間的競爭,把這些子任務分別放到不同的佇列裡,併為每個佇列建立一個單獨的執行緒來執行佇列裡的任務,執行緒和佇列一一對應。比如A執行緒負責處理A佇列裡的任務。但是,有的執行緒會先把自己佇列裡的任務幹完,而其他執行緒對應的佇列裡還有任務等待處理。幹完活的執行緒與其等著,不如去幫其他執行緒幹活,於是他就去其他執行緒的佇列裡竊取一個任務來執行。而在這時他們會訪問同一個佇列,所以為了減少竊取任務執行緒和被竊取任務執行緒之間的競爭,通常會使用雙端佇列,被竊取任務執行緒永遠從雙端佇列的頭部拿任務執行,而竊取任務的執行緒永遠從雙端佇列的尾部拿任務執行。

工作竊取的執行流程如下圖所示。

  • 工作竊取演算法的優點:充分利用執行緒進行平行計算,減少了執行緒間的競爭。
  • 工作竊取演算法的缺點:在某些情況下還是存在競爭,比如雙端佇列裡只有一個任務時。並且該演算法會消耗了更多的系統資源,比如建立多個執行緒和多個雙端佇列。

經典示例:Fork/Join框架。