¿Alguien puede explicar por qué este programa devuelve el valor correcto para sqrt_min?parallel.foreach funciona, pero ¿por qué?
int n = 1000000;
double[] myArr = new double[n];
for(int i = n-1 ; i>= 0; i--){ myArr[i] = (double)i;}
// sqrt_min contains minimal sqrt-value
double sqrt_min = double.MaxValue;
Parallel.ForEach(myArr, num =>
{
double sqrt = Math.Sqrt(num); // some time consuming calculation that should be parallized
if(sqrt < sqrt_min){ sqrt_min = sqrt;}
});
Console.WriteLine("minimum: "+sqrt_min);
ver también http://stackoverflow.com/questions/3679209/why-doesnt-this-code-demonstrate-the-non-atomicity-of-reads-writes~~V~~singular~~3rd puede que no sea suerte. Puede ser porque su CPU ofrece operaciones dobles atómicas, aunque C# no lo garantiza. – hatchet
Existe la posibilidad de que corregir este error introduzca suficiente contención de bloqueo que será más lento que simplemente calcular las raíces cuadradas en un hilo. Una solución mejor sería hacer que cada CPU calcule muchas raíces cuadradas, controlando sus propios mínimos y encontrando el mínimo global cuando cada CPU está lista. Aún tendrá contención, pero la afirmación solo se aplicará al comparar los mínimos locales específicos del subproceso, en lugar de cada raíz cuadrada. – Brian