Я изучаю цикл Parallelism Break in a.
После чтения this и this Я все еще есть вопрос:
Я ожидаю этот код:
Parallel.For(0, 10, (i,state) =>
{
Console.WriteLine(i); if (i == 5) state.Break();
}
Чтобы получить не более 6 чисел (0..6). не только он этого не делает, но имеет другую длину результата:
02351486
013542
0135642
Очень раздражает. (где ад здесь Break() {после 5} здесь?)
Итак, я посмотрел на msdn
Разрыв может использоваться для связи с циклом, чтобы никакие другие итерации после текущей итерации не выполнялись. Если Break вызывается из 100-й итерации цикла for, итерации в параллельно от 0 до 1000, все итерации менее 100 должны но итерации от 101 до 1000 не нужны.
Quesion #1 :
Какие итерации? общий счетчик итераций? или на поток? Я уверен, что это за поток. пожалуйста, одобрите.
Question #2 :
Предположим, что мы используем раздел Parallel + range (из-за отсутствия изменения стоимости процессора между элементами), поэтому он делит данные между потоками. Итак, если у нас есть 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 :
Как cn я действительно ломаюсь, когда (i == 5)
?
p.s.
Я имею в виду, давай! когда я делаю Break()
, я хочу, чтобы цикл был остановлен.
как и в обычном цикле For
.