Estoy investigando el Parallelismo Break en un bucle For.Parallel.For and Break() malentendido?
Después de leer this y this todavía tengo una pregunta:
yo esperaría que este código:
Parallel.For(0, 10, (i,state) =>
{
Console.WriteLine(i); if (i == 5) state.Break();
}
para producir al la mayoría de 6 números (0..6). no sólo no lo está haciendo, pero tienen diferente longitud del resultado:
02351486
013542
0135642
muy molesto. (¿Dónde demonios está Break() {5} después de aquí ??)
Así que miré a MSDN
rotura puede ser utilizado para comunicarse con el bucle que no hay otras iteraciones después de la iteración actual tienen que ser correr. Si se invoca Break desde la centésima iteración de un bucle for que itera en paralelo de 0 a 1000, todas las iteraciones menores de 100 deben seguir ejecutándose , pero las iteraciones de 101 a 1000 no son necesarias.
quesion # 1:
Qué iteraciones? el contador de iteración general? o por hilo? Estoy bastante seguro de que es por hilo. por favor apruébalo.
Pregunta # 2:
supongamos que estamos utilizando partición Parallel gama + (debido a ningún cambio costo de CPU entre los elementos), de modo que divide los datos entre los hilos. Así que si tenemos 4 núcleos (y divisiones perfectos entre ellos):
core #1 got 0..250
core #2 got 251..500
core #3 got 501..750
core #4 got 751..1000
modo que el hilo en core #1
se reunirán value=100
en algún momento y se romperá. este será su número de iteración 100
. Pero el hilo en core #4
tiene más cuantos y ahora está en 900
. él es más allá de su 100'th
iteración. ¡No tiene índice menos de 100 para detenerse! - para que él los muestre a todos.
¿No es así? ¿Es esa la razón por la que obtengo más de 5 elementos en mi ejemplo?
Pregunta # 3:
Cómo cn que realmente se rompen cuando (i == 5)
?
p.s.
Quiero decir, vamos! cuando hago Break()
, quiero que el loop se detenga. exactamente como lo hago en el lazo normal For
.
quiere decir que _Break() hará que el bucle ya no procese ningún valor que su INDICE> 5_ .... ¿verdad? –
@RoyiNamir Sí, más o menos. Los elementos seguirán procesándose si ya se han programado y comenzado, pero no se procesarán nuevos elementos. Si se encuentra en 'Parallel.ForEach', los elementos más allá de la ubicación en la enumeración a la que llamará Break() ya no se programarán. –
¿hay alguna diferencia en 'for vs foreach' con respecto al descanso ??? –