Czy ktoś może wyjaśnić, dlaczego ten program zwraca poprawną wartość dla sqrt_min?parallel.foreach działa, ale dlaczego?
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);
zobaczyć również http://stackoverflow.com/questions/3679209/why-doesnt-this-code-demonstrate-the-non-atomicity-of-reads-writes nie może być szczęście. Być może twój procesor dostarcza podwójne operacje atomowe, mimo że C# nie gwarantuje tego. – hatchet
Istnieje możliwość, że naprawienie tego błędu wprowadzi dostateczną liczbę twierdzeń, że będzie wolniejsze niż obliczanie pierwiastków kwadratowych w jednym wątku. Lepszym rozwiązaniem byłoby, gdyby każdy procesor obliczał wiele pierwiastków kwadratowych, śledził ich własne minimum i znajdował globalne minimum, kiedy każdy procesor jest wykonywany. Nadal będziesz mieć spór, ale rywalizacja będzie stosowana tylko podczas porównywania lokalnych minimalnych wątków, a nie dla każdego pierwiastka kwadratowego. – Brian