我正在调查 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
Break 可用于与循环通信,在当前迭代之后不需要运行其他迭代。如果从从 0 到 1000 并行迭代的 for 循环的第 100 次迭代中调用 Break,则仍应运行小于 100 的所有迭代,但从 101 到 1000 的迭代不是必需的。
Quesion #1 :
哪些迭代?整体迭代计数器?还是每个线程?我很确定它是每个线程。请批准。
Question #2 :
假设我们正在使用 Parallel + range 分区(由于元素之间没有 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
循环中所做的那样。