我正在研究 For 循环中的并行性中断。
看完之后this http://tipsandtricks.runicsoft.com/CSharp/ParallelClass.html and this http://reedcopsey.com/2010/01/22/parallelism-in-net-part-3-imperative-data-parallelism-early-termination/我还有一个问题:
我期望这段代码:
Parallel.For(0, 10, (i,state) =>
{
Console.WriteLine(i); if (i == 5) state.Break();
}
屈服于most6 个数字 (0..6)。
他不仅没有这样做,而且结果长度也不同:
02351486
013542
0135642
很烦人。 (Break() {after 5} 到底在哪里??)
于是我看了一下msdn
Break 可用于向循环传达当前迭代之后不需要运行其他迭代的信息。
如果从 for 循环的第 100 次迭代开始调用 Break
从 0 到 1000 并行,所有小于 100 的迭代仍然应该是
运行,但从 101 到 1000 的迭代是不必要的。
Quesion #1 :
哪些迭代?总体迭代计数器 ?或每个线程?我很确定它是每个线程的。请批准。
Question #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
现在。他是远远超出 his 100'th
迭代。
他的指数没有低于 100 就可以被阻止! -所以他会向他们展示全部。
我对吗 ?这就是我在示例中得到超过 5 个元素的原因吗?
Question #3 :
我怎样才能真正打破(i == 5)
?
p.s.
我的意思是,来吧!当我做Break()
,我希望循环停止。
和我平常做的一样For
loop.