質問

ブライアン・ゲッツはフォーク・ジーンに関する素敵な記事を書きました http://www.ibm.com/developerworks/java/library/j-jtp03048.html. 。その中で、彼はフォーク結合メカニズムを使用してマージソートアルゴリズムをリストします。このメカニズムでは、配列の両側で並列に並列を実行し、結果をマージします。

アルゴリズムは、同じ配列の2つの異なるセクションで同時にソートします。 AtomicIntegerArrayや視界を維持するために必要な他のメカニズムが必要なのはなぜですか?一方のスレッドが他のスレッドによって行われた書き込みが表示されるという保証は何ですか、それともこれは微妙にバグですか?フォローアップとして、ScalaのForkjoinschedulerもこの保証を作成していますか?

ありがとう!

役に立ちましたか?

解決

(Forkjoinの)それ自体には、同期ポイントが必要です。これは最も重要な情報です。同期ポイントは、その発生がすべてのポイントの後に表示されるすべての書き込みを保証します。

コードを見ると、同期ポイントがどこで発生するかを確認できます。これは、Invokeallを呼び出す1つのメソッドです

public static void invokeAll(ForkJoinTask<?> t1, ForkJoinTask<?> t2) {
    t2.fork();
    t1.invoke();
    t2.join();
}

ここで、T2は別のプロセスに分岐し、T1はタスクを実行し、その呼び出しスレッドはT2.join()で待機します。 T2を渡すとき。 T1とT2へのすべての書き込みが表示されます。

編集:この編集は、同期ポイントが意味することの説明をもう少し説明するためです。

2つの変数があるとしましょう

int x;
volatile int y;

あなたがYに書くときはいつでも、あなたが読む前に起こったすべての書き込みが利用可能になります。例えば

public void doWork(){
   x = 10;
   y = 5;
}

別のスレッドがy = 5を読み取る場合、そのスレッドは 保証されています x = 10を読むには、これはyへの書き込みが、前述の前にすべての書き込みが書き込み後に表示される同期ポイントを作成するためです。

フォークが結合すると、ForkJointaskの結合が同期ポイントを作成します。 T2.fork()およびt1.invoke()の場合、T2の結合により、以前に起こったすべての書き込みが見られることが保証されます。以前のすべての書き込みは同じ構造内にあるため、視認性が安全になります。

それがそれほど明確ではない場合、私はさらに説明していただければ幸いです。

他のヒント

ただの推測:マージにはスレッドへの結合が含まれ、結合は可視性を保証します。

2番目の部分は確かです。 Mergeがどのように実装されているのかわかりません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top