9

(टी का) ReadOnlyCollection के लिए दस्तावेज़ कहा गया है कि:ReadOnlyCollection <T> थ्रेड सुरक्षा

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

  1. क्यों की गणना नहीं थ्रेड-सुरक्षित
  2. संभव निहितार्थ क्या हैं, और
  3. क्या सामान्य रूप से उपयोग किया जाता है समाधान:

मेरा प्रश्न बोल्ड भाग का संबंध?

+1

ओह लड़का। मैं thread- लड़ किया गया है बहुत लंबे समय तक .NET पर सुरक्षित सूचियां। यहां कुछ पिछली चर्चाएं देखें: http://stackoverflow.com/questions/550616/lock -फ्री-स्टैक-एंड-क्यूई-इन-सी-तेज और/या यहां: http://stackoverflow.com/questions/66622/threadsafe-foreach-enumeration-of-lists – Radu094

उत्तर

7

सी # का एक बहुत अच्छा संग्रह मॉडल है, लेकिन ReadOnlyCollection क्लास पूरे मॉडल में सबसे दुर्भाग्य से कल्पना (या नामित) कक्षाओं में से एक है। इसे एक उचित रूप से एक पाठक सूची कहा जाना चाहिए, न कि एक पठनीय संग्रह।

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

तो संग्रह संग्रह के माध्यम से गणना थ्रेड-सुरक्षित होगी अगर संग्रह वास्तव में पढ़ा गया था; लेकिन चूंकि यह केवल पढ़ने के लिए नहीं है, यह धागा सुरक्षित नहीं है। आपके पास प्रतिष्ठा की मात्रा को देखते हुए, मुझे पूरा यकीन है कि आप सोच नहीं रहे हैं कि गैर-पढ़ने-योग्य संग्रह के माध्यम से गणना करना क्यों थ्रेड सुरक्षित नहीं है।

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

संपादित

मैं कर रहा हूँ मेरा उत्तर कई महीने बाद फिर से पढ़ना, (धन्यवाद, के asyncwait टिप्पणी) और मुझे लगता है कि मैं अपनी प्रतिष्ठा के आधार पर मान्यताओं बनाने के बिना ओपी के सभी सवालों का जवाब देना चाहिए था। ओपी को अब तक उसका जवाब मिला है, लेकिन मैं भविष्य के पाठकों के लिए यह करूँगा।

एक वास्तविक-पढ़ने-पढ़ने वाले संग्रह के माध्यम से गणना करना आंतरिक कारणों से आंतरिक रूप से थ्रेड-सुरक्षित नहीं है, यहां तक ​​कि एकल-थ्रेडेड परिदृश्य में भी आप इसे गणना करते समय संग्रह को संशोधित नहीं कर सकते हैं। (जावा में ConcurrentModificationException, C# में अमान्यऑपरेशन अपवाद।) एकल-थ्रेडेड परिदृश्य में आप यह सुनिश्चित कर सकते हैं कि आपका गणना कोड किसी भी तरह से संग्रह को बदलने का प्रयास नहीं करता है, लेकिन बहु-थ्रेडेड परिदृश्य में एक थ्रेड संग्रह की गणना कर सकता है जबकि एक और धागा एक ही समय में इसे बदल सकता है।

+0

नोट: मैंने एसएससीएलआई (रोटर) की जांच की मेरा उत्तर लिखने से पहले ReadOnlyCollection का स्रोत कोड, यह सुनिश्चित करने के लिए कि यह वास्तव में एक सजावटी (रैपर।) –

+0

I दूसरा है। यह सिर्फ एक आवरण है। अगर आपका संग्रह कुछ अन्य वर्ग के बाहर संशोधित संशोधित किया गया है तो बहुत बेकार। धागे की दुनिया में नाम गुमराह करता है। – asyncwait

+0

@asyncwait आपकी टिप्पणी के लिए धन्यवाद, यह मुझे याद दिलाता है कि मुझे अपने जवाब में एक संशोधन जोड़ना चाहिए। –

3

यह MSDN article staes: "ReadOnlyCollection जेनेरिक क्लास का एक उदाहरण हमेशा पढ़ने के लिए होता है।एक संग्रह है कि केवल पढ़ने के लिए बस उस संग्रह "

तो मेरा मानना ​​है कि बार-बार दोहराना सुरक्षित थ्रेड नहीं है के रूप में यह आंतरिक रूप से वस्तुओं की एक सामान्य गैर धागा सुरक्षित संग्रह का उपयोग करता है को संशोधित करने से रोकता है एक आवरण के साथ एक संग्रह है।

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

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