For ループの並列処理の中断を調査しています。
私はこのコードを期待します:
Parallel.For(0, 10, (i,state) =>
{
Console.WriteLine(i); if (i == 5) state.Break();
}
最大で6 つの数字 (0..6)を生成します。彼はそれをしていないだけでなく、結果の長さが異なります:
02351486
013542
0135642
とてもうるさい。(Break() {after 5} はどこにあるの??)
だから私はmsdnを見ました
ブレークは、現在の反復の後に他の反復を実行する必要がないことをループに伝えるために使用できます。0 から 1000 まで並列に反復する for ループの 100 番目の反復から Break が呼び出された場合、100 未満の反復はすべて実行されますが、101 から 1000 までの反復は必要ありません。
Quesion #1 :
どの繰り返し?全体の反復カウンター ? またはスレッドごと?スレッドごとにあると確信しています。承認してください。
Question #2 :
Parallel + range partition (要素間で CPU コストが変わらないため) を使用していると仮定して、データをスレッド間で分割します。したがって、4 つのコア (およびそれらの間の完全な分割) がある場合:
core #1 got 0..250
core #2 got 251..500
core #3 got 501..750
core #4 got 751..1000
そのため、スレッドはいつかcore #1
出会い、壊れます。value=100
これが彼の反復番号になり 100
ます。しかし、スレッドcore #4
はより多くの量子を取得し、彼は900
今です。彼は彼の反復をはるかに超えています。100'th
彼は100未満のインデックスを持っていません!! -だから彼はそれらすべてを見せます。
私は正しいですか?それが私の例で5つ以上の要素を取得する理由ですか?
Question #3 :
いつ本当に壊れるの(i == 5)
ですか?
ps
つまり、さあ!私がそうするときBreak()
、私は物事のループを止めたいです。通常のFor
ループで行うのとまったく同じです。