क्या कोई समझा सकता है, यह प्रोग्राम sqrt_min के लिए सही मान क्यों लौटा रहा है?समानांतर .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 यह भाग्य नहीं हो सकता है देखते हैं। ऐसा इसलिए हो सकता है क्योंकि आपका सीपीयू परमाणु डबल ऑपरेशंस प्रदान करता है भले ही सी # इसकी गारंटी नहीं देता है। – hatchet
ऐसी संभावना है कि इस बग को ठीक करने से पर्याप्त ताला विवाद हो जाएगा कि यह केवल एक धागे पर वर्ग की जड़ों की गणना करने से धीमा होगा। एक बेहतर समाधान यह होगा कि प्रत्येक सीपीयू कई वर्ग जड़ों की गणना करे, अपने स्वयं के न्यूनतम सीमाओं का ट्रैक रखे, और प्रत्येक सीपीयू के दौरान वैश्विक न्यूनतम खोज लें। आपके पास अभी भी विवाद होगा, लेकिन विवाद केवल प्रत्येक एकल वर्ग रूट के बजाय थ्रेड-विशिष्ट स्थानीय न्यूनतम की तुलना करते समय लागू होगा। – Brian