Может кто-нибудь объяснить, почему эта программа возвращает правильное значение для sqrt_min?parallel.foreach работает, но почему?
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);
смотри также http://stackoverflow.com/questions/3679209/why-doesnt-this-code-demonstrate-the-non-atomicity-of-reads-writes это не может быть удача. Это может быть связано с тем, что ваш процессор обеспечивает атомарные двойные операции, хотя C# не гарантирует его. – hatchet
Существует вероятность того, что исправление этой ошибки приведет к достаточно большому количеству конфликтов, которые будут медленнее, чем просто вычисление квадратных корней на одном потоке. Лучшим решением было бы, чтобы каждый процессор вычислял много квадратных корней, отслеживая их собственные минимумы и находил глобальный минимум, когда каждый процессор был выполнен. У вас все еще есть конкуренция, но конкуренция будет применяться только при сравнении локальных минимумов, специфичных для потока, а не для каждого квадратного корня. – Brian