3

Doug Lea の論文「A Java Fork/Join Framework」では:

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

2.1 Work-Stealing で、彼は次のように述べています。

ワーカー スレッドが結合操作に遭遇すると、他のタスクが利用可能であれば、ターゲット タスクが (isDone を介して) 完了したことが通知されるまで処理します。それ以外の場合、すべてのタスクはブロックされることなく完了するまで実行されます。

では、これらの「他のタスク」がどこから来たのか、具体的に教えてもらえますか? それらは他のワーカースレッドのタスクキューからのものですか? ワーカースレッドが結合呼び出しに遭遇するたびに、「独自のキュー内の他のタスクにスキップする」のではなく、「他のスレッドからタスクを盗む」ことに進むということですか?

4

1 に答える 1

2

「他のタスク」は、保留中のタスク、他のスレッドの両端キューがある場合、または新しい要求の送信キューから、独自の両端キュー内から来る場合があります。

join() はかなり難しい手順です。これには、タスク制御が含まれます。つまり、タスクがアクティブな処理を行っていて、何かを待って一時停止しているときにタスクを制御する機能です。アプリケーションでこれを行うと、通常は機能しません。(オペレーティング システムはこれをうまく行い、Cilk、JCilk はコンパイラ/ランタイムを使用してそれを行います。) Doug Lea は、ジョインがワーカー スレッドを停止させるときに「継続スレッド」を使用します。

于 2012-04-11T13:27:53.060 に答える