簡體   English   中英

有關 Fork-Join 框架的詳細信息

[英]A detail about the Fork-Join Framework

在 Doug Lea 的論文“A Java Fork/Join Framework”中:

http://gee.cs.oswego.edu/dl/papers/fj.pdf

在 2.1 Work-Stealing 中他說:

當工作線程遇到連接操作時,它會處理其他任務(如果可用),直到注意到目標任務已完成(通過 isDone)。 否則,所有任務都會在不阻塞的情況下運行至完成。

那么誰能具體告訴我這些“其他任務”是從哪里來的呢? 它們來自其他工作線程的任務隊列嗎? 這是否意味着每當工作線程遇到連接調用時,它就會繼續“從其他線程竊取任務”而不是“跳到自己隊列中的其他任務”?

當有待處理任務時,“其他任務”可能來自它自己的雙端隊列,其他線程的雙端隊列,或者來自新請求的提交隊列。

join() 是一個相當困難的過程。 它涉及到任務控制,即在任務處於活動處理和暫停等待狀態時能夠控制任務。 在應用程序中這樣做通常是行不通的。 (操作系統做得很好,Cilk、JCilk 通過使用編譯器/運行時來做到這一點。)Doug Lea 在連接陷入工作線程時使用“延續線程”。

Fork / Join框架中的每個工作線程都有一個工作隊列,使用Deque實現。

每次創建新任務(或子任務)時,都會將其推送到自己的隊列的頭部。 當任務完成任務並與尚未完成的另一個任務執行連接時,它會很智能。 線程從其隊列的頭部彈出一個新任務並開始執行而不是休眠(為了等待另一個任務完成)。 實際上,如果線程的隊列為空,則線程從屬於另一個線程的隊列的尾部彈出一個任務。 這只不過是一種偷工作的算法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM