अन्य उत्तरों की तरह उल्लेख किया गया है, sum
एकाधिक धागे से चर (जो समानांतर है। फोरएच करता है) को थ्रेड-सुरक्षित ऑपरेशन नहीं है। अद्यतन करने से पहले लॉक प्राप्त करने का मामूली फिक्स को समस्या ठीक करेगा।
double sum = 0.0;
Parallel.ForEach(myCollection, arg =>
{
lock (myCollection)
{
sum += ComplicatedFunction(arg);
}
});
हालांकि, यह अभी तक एक और समस्या पेश करता है। चूंकि लॉक प्रत्येक पुनरावृत्ति पर अधिग्रहण किया जाता है, इसका मतलब है कि प्रत्येक पुनरावृत्ति का निष्पादन प्रभावी ढंग से क्रमबद्ध किया जाएगा। दूसरे शब्दों में, यह एक सादे पुराने foreach
पाश का उपयोग करना बेहतर होगा।
अब, यह अधिकार प्राप्त करने की चाल अलग-अलग और स्वतंत्र चक्स में समस्या को विभाजित करना है। सौभाग्य से यह करना बहुत आसान है जब आप जो करना चाहते हैं वह पुनरावृत्तियों का परिणाम है क्योंकि योग ऑपरेशन कम्यूटेटिव और सहयोगी है और क्योंकि पुनरावृत्तियों के मध्यवर्ती परिणाम स्वतंत्र हैं।
तो यहां यह है कि आप इसे कैसे करते हैं।
double sum = 0.0;
Parallel.ForEach(myCollection,
() => // Initializer
{
return 0D;
},
(item, state, subtotal) => // Loop body
{
return subtotal += ComplicatedFunction(item);
},
(subtotal) => // Accumulator
{
lock (myCollection)
{
sum += subtotal;
}
});
स्रोत
2010-07-30 03:55:32
सी [ वेतन वृद्धि parallel.foreach गुंजाइश बाहर गिनती मूल्य] (http://stackoverflow.com/questions/2394447/increment-a-count-value-outside-parallel-foreach-scope)। असल में, आप [इंटरलॉक] (http://msdn.microsoft.com/en-us/library/55dzx06b.aspx) का उपयोग कर सकते हैं यदि आपको आवश्यकता हो, लेकिन यदि संभव हो तो साइड इफेक्ट्स से बचना बेहतर होता है। –