我正在調查For循環中的Parallelism Break。Parallel.For和Break()誤解?
我期望此代碼:
Parallel.For(0, 10, (i,state) =>
{
Console.WriteLine(i); if (i == 5) state.Break();
}
爲了獲得在最 6號(0..6)。 不僅他沒有這樣做,但有不同的結果長度:
02351486
013542
0135642
很煩人。 (這裏是地獄歇(){5}後這裏?)
所以我看了看MSDN
歇可用於向循環傳達當前迭代之後沒有其他迭代需要的話跑。 如果Break是從 並行從0到1000迭代的for循環的第100次迭代中調用的,則所有小於100的迭代仍應爲 運行,但從101到1000的迭代不是必需的。
Quesion#1:
哪些迭代?整個迭代計數器?或每個線程?我很確定它是每個線程。請批准。
問題2:
讓我們假設我們正在使用並行+範圍分區(由於元件之間沒有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個元素的原因嗎?
問題3:
如何CN我真正休息的時候(i == 5)
?
p.s.
我的意思是,加油!當我做Break()
時,我希望循環停止。 excuctly正如我在常規For
循環中所做的那樣。
你的意思是_Break()會導致循環不再處理任何值,它們的INDEX> 5_ ....對吧? –
@RoyiNamir是的,有點。如果項目已經安排並開始,項目仍然會被處理,但是沒有新項目會被處理。如果你在'Parallel.ForEach'中,那麼你調用Break()的枚舉中的位置將不再被調度。 –
有沒有anu區別'對於foreach'關於break? –