Bất cứ ai có thể giải thích, tại sao chương trình này trả lại giá trị chính xác cho sqrt_min?parallel.foreach hoạt động, nhưng tại sao?
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);
xem thêm http://stackoverflow.com/questions/3679209/why-doesnt-this-code-demonstrate-the-non-atomicity-of-reads-writes nó có thể không may mắn. Nó có thể là do cpu của bạn cung cấp các hoạt động gấp đôi nguyên tử mặc dù C# không đảm bảo nó. – hatchet
Có khả năng sửa lỗi này sẽ giới thiệu đủ tranh chấp khóa rằng nó sẽ chậm hơn so với chỉ tính căn bậc hai trên một sợi. Một giải pháp tốt hơn là để có mỗi CPU tính toán nhiều căn bậc hai, theo dõi mức tối thiểu của chúng và tìm ra mức tối thiểu toàn cầu khi mọi CPU được thực hiện. Bạn vẫn sẽ có tranh chấp, nhưng tranh chấp sẽ chỉ áp dụng trong khi so sánh các mức tối thiểu địa phương cụ thể theo chủ đề, thay vì cho mỗi một căn bậc hai. – Brian