2012-12-05 33 views
6

जबकि मैं अपने ढांचे के समानांतरता पर काम कर रहा हूं, मैंने एक अजीब स्थिति का सामना किया है जिसे मैं कल्पना नहीं कर सकता! मैंने स्थिति को आसान बनाने के लिए स्थिति को सरल बना दिया।एक स्थानीय थ्रेड के माध्यम से एक अन्य थ्रेड के माध्यम से, यह संभव है कि

foreach(var person in personList) 
{ 
    if (person.Name == "Mehran") 
     break; 
} 

जो personList से अधिक थ्रेड के बीच साझा किया जाता है: इस कोड पर विचार करें।

person के लिए null होने के लिए कौन सी परिस्थितियों में यह संभव है और person.Name के लिए मुझे NullReferenceException मिल गया है?

मुझे पता है के रूप में, व्यक्ति एक स्थानीय चर यहाँ के रूप में माना जाता है और अगर हम foreach ब्लॉक में हो, तो हम personList सफलतापूर्वक दोहराया है, तो person किसी भी परिस्थिति या किसी समानांतर स्थिति में शून्य नहीं होना चाहिए।

भले ही personList किसी अन्य थ्रेड द्वारा बदला गया हो, या संदर्भित person का निपटारा किया गया है, person चर का मूल्य होना चाहिए। क्योंकि किसी को भी बदलने की सुविधा नहीं है जहां person का संदर्भ दिया गया है।

क्या स्थिति की व्याख्या करने के लिए यह कोई परिदृश्य है?

उत्तर

11

मुझे पता है के रूप में, व्यक्ति एक स्थानीय चर के रूप में यहाँ माना जाता है और अगर हम foreach ब्लॉक में हो, तो हम personList सफलतापूर्वक दोहराया है, इसलिए व्यक्ति को किसी भी परिस्थिति या किसी समानांतर स्थिति में शून्य नहीं होना चाहिए ।

सिर्फ इसलिए कि आप personList से अधिक सक्रिय हो रहे हैं इसका मतलब यह नहीं है कि इसमें कोई शून्य मान नहीं है। उदाहरण के लिए:

List<Person> personList = new List<Person>(); 
personList.Add(null); 

foreach (var person in personList) 
{ 
    // Here, person will be null 
} 

(साथ ही, यदि कुछ भी सूची को संशोधित किया गया है, तो आप आम तौर पर मुसीबत में होते हैं - लेखकों का सामना करने में सुरक्षित थ्रेड-वे नहीं कर रहे हैं - लेकिन मुझे नहीं लगता है कि जरूरतों करते समस्या का हिस्सा बनने के लिए।)

+0

Wooops! सूचियां नल स्वीकार कर सकते हैं! समांतर स्थितियों ने मुझे आवश्यक से अधिक जटिल लगता है! बहुत बहुत धन्यवाद जॉन। – mehrandvd

+0

हाँ, मुझे समांतर स्थितियों में सूची संशोधन समस्याओं के बारे में पता है। मुझे लगता है कि आपका सरल और त्वरित उत्तर इसे हल करेगा। मैं सूची में संभावित नल की जांच करूंगा। – mehrandvd

3

परिवर्तनीय संशोधित नहीं है। foreach निर्माण को लागू करने के लिए सुरक्षित नहीं है थ्रेड इस्तेमाल किया इटरेटर:

List<T>.IEnumerable<T>.GetEnumerator() के प्रलेखन से here पाया:

एक प्रगणक तक संग्रह अपरिवर्तित रहता है के रूप में मान्य रहता है। यदि संग्रह में परिवर्तन किए जाते हैं, जैसे तत्व जोड़ना, संशोधित करना या हटाना, तो गणनाकर्ता को अपरिवर्तनीय रूप से अमान्य कर दिया गया है और इसका व्यवहार अपरिभाषित है।

गणक के पास संग्रह तक विशेष पहुंच नहीं है; इसलिए, संग्रह के माध्यम से गणना करना आंतरिक रूप से थ्रेड-सुरक्षित प्रक्रिया नहीं है। गणना के दौरान थ्रेड सुरक्षा की गारंटी के लिए, आप संपूर्ण गणना के दौरान संग्रह को लॉक कर सकते हैं। संग्रह को पढ़ने और लिखने के लिए संग्रह को कई धागे से एक्सेस करने की अनुमति देने के लिए, आपको अपना सिंक्रनाइज़ेशन लागू करना होगा।

System.Collections.Generic नामस्थान में संग्रहों के डिफ़ॉल्ट कार्यान्वयन सिंक्रनाइज़ नहीं हैं।

यदि आप किसी अन्य थ्रेड सूची को संशोधित कर सकते हैं तो आपको हमेशा उन पर पुनरावृत्ति करते समय सूचियों को लॉक करना चाहिए।

संबंधित मुद्दे

 संबंधित मुद्दे