2012-12-03 38 views
7

मैं एकाधिक धागे से एक्सेस करने के लिए एक पठनीय-शब्दकोश की तलाश में हूं। जबकि ConcurrentDictionary ऐसी क्षमताओं का खुलासा करता है, मैं ओवरहेड और अजीब एपीआई नहीं चाहता हूं।ReadOnlyDictionary थ्रेड-सुरक्षित क्यों नहीं है?

.NET 4.5 ऐसी कक्षा प्रदान करते समय, दस्तावेज बताता है कि केवल स्थिर कॉल सुरक्षित हैं।

मुझे आश्चर्य है क्यों?

+0

कॉपी: थ्रेड सुरक्षा ConcurrentDictionary की सभी सार्वजनिक और संरक्षित सदस्यों धागा सुरक्षित हैं और एक से अधिक थ्रेड से समवर्ती इस्तेमाल किया जा सकता है। –

+3

@ केनचुंग: यह स्पष्ट नहीं है कि आपकी टिप्पणी प्रासंगिक क्यों है। सवाल इंगित करता है कि ओपी पहले से ही 'ConcurrentDictionary <,>' से अवगत है, लेकिन 'ReadOnlyDictionary <,>' की सुरक्षा के बारे में पूछ रहा है। –

उत्तर

8

ReadOnlyDictionary किसी भी अन्य शब्दकोश के आसपास सिर्फ एक रैपर है। इस प्रकार, यह केवल अंतर्निहित शब्दकोश के रूप में थ्रेड-सुरक्षित के रूप में है।

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

आप एक ReadOnlyDictionary जो सभी कोणों से प्रभावी ढंग से अपरिवर्तनीय है चाहते हैं, आप मूल शब्दकोश का क्लोन बनाने कि चारों ओर एक ReadOnlyDictionary आवरण बनाते हैं और फिर कहीं भी क्लोन के लिए एक संदर्भ नहीं रख सकते हैं। के साथ केवल पढ़ रहे ऑपरेशन चल रहे हैं, तो यह थ्रेड-सुरक्षित होना चाहिए। बेशक, यदि कुंजी या मूल्य प्रकार उत्परिवर्तनीय हैं, तो चिंता करने के लिए "थ्रेड-असफ़ाटी" की दूसरी डिग्री खुलती है। माइक्रोसॉफ्ट दस्तावेज़ से

+0

मैंने भी ऐसा सोचा। धन्यवाद। – Mouk

+3

बस एक स्पष्टीकरण। केवल पढ़ने के लिए थ्रेड-सुरक्षित नहीं है। क्या होगा यदि शब्दकोश पढ़ने के आधार पर वस्तुओं को पुनर्व्यवस्थित करता है? बीसीएल शब्दकोश यह नहीं करता है (AFAIK) लेकिन मैंने कहीं पढ़ा है कि Scripting.Dictionary अंतिम पठन आइटम को बाल्टी में पहली स्थिति में ले जाता है। – adrianm

+1

@adrianm: हाँ, यह सच है। लेकिन आप एक 'System.Collections.Generic.Dictionary' को लपेट सकते हैं जिसे कभी संशोधित नहीं किया गया था, और * वह * ठीक होगा। –