2010-01-11 10 views
19

यदि मैं एक बार एक सामान्य शब्दकोश शुरू करता हूं, और आगे कोई जोड़/अपडेट/हटाने की अनुमति नहीं है, तो क्या यह लॉकिंग के साथ इसे पढ़ने से कई धागे पढ़ने के लिए सुरक्षित है (यह मानते हुए कि शब्दकोश पाठकों के शुरू होने से पहले शुरू किया गया है)?किसी शब्दकोश की थ्रेड सुरक्षा <TKey, TValue>

गैर-सामान्य HashTable कि कहना है कि यह कई पाठकों के लिए सुरक्षित है के लिए मदद में एक नोट है, लेकिन मैं हाँ, यह सुरक्षित है जेनेरिक शब्दकोश

उत्तर

34

अपने भविष्य के संदर्भ के लिए केवल एक मुद्दा है, प्रलेखन यहाँ है:

http://msdn.microsoft.com/en-us/library/xfhwa508.aspx

इसे कहते हैं:

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

+0

बस यह सुनिश्चित करना चाहते हैं कि मैं समझता हूं कि "यहां तक ​​कि ..." उद्धृत पैराग्राफ का हिस्सा सही ढंग से है। क्या यह सच है कि: (1) यदि शब्दकोश अब संशोधित नहीं किया जाएगा (जैसा कि ओपी के प्रश्न में उल्लिखित है), तो गणना करना कोई समस्या नहीं होगी। (2) यदि शब्दकोश भविष्य में संभावित रूप से संशोधित किया जाएगा, तो 'ConcurrentDictionary' गणना भी "आंतरिक रूप से थ्रेड-सुरक्षित प्रक्रिया नहीं है"। सही बात? – RayLuo

+0

@RayLuo: आम तौर पर आपको एक संग्रह को संशोधित करने की अनुमति नहीं है, जबकि गणना "उड़ान में" है, भले ही यह बहुप्रचारित या एकल थ्रेड हो। –

+0

समवर्ती ढांचे के संग्रह (उदा।, 'System.Collections.Concurrent.ConcurrentDictionary') आम तौर पर गणना के दौरान संशोधन की अनुमति देते हैं। हालांकि, वे संग्रह की एक प्रति बनाकर और प्रतिलिपि बनाने के द्वारा इसे पूरा करते हैं। और प्रतिलिपि बनाते समय पूरा संग्रह लॉक हो जाता है। एक ढांचा अभियंता तर्क दे सकता है कि इसका मतलब है कि आप संग्रह में संशोधन नहीं कर रहे हैं, जबकि गणना "उड़ान में" है (चूंकि हुड के नीचे, पूरी चीज लॉक हुई थी, जबकि गणना "उड़ान में" थी, लेकिन फ्रेमवर्क उपयोगकर्ता के परिप्रेक्ष्य से , गणना उड़ान में है। – Brian

13

के लिए नहीं एक समान नहीं देखा है अगर आप डॉन अब शब्दकोश को संशोधित नहीं करें। थ्रेड सुरक्षा पढ़ें/लिखें परिदृश्यों

+11

हालांकि, आपको आंतरिक स्थिति को ध्यान में रखना होगा। बाहरी रूप से, आप केवल शब्दकोश से मूल्य पढ़ सकते हैं। हालांकि, हालांकि, आप नहीं जानते कि पुनर्प्राप्ति के दौरान राज्य संक्रमण क्या हो सकता है। – JMarsch

+0

ओपी @ जेमारस्च ने ऊपर टिप्पणी की और 10 अप-वोट प्राप्त किए। तो वह "आंतरिक स्थिति" चीज ओपी के परिदृश्य को कैसे प्रभावित करेगी? क्या यह अभी भी ठीक है कि 'यदि मैं एक सामान्य शब्दकोष को एक बार शुरू करता हूं, और आगे कोई जोड़/अपडेट/हटाए जाने की अनुमति नहीं है, तो क्या यह लॉकिंग के साथ कई धागे पढ़ने के लिए सुरक्षित है (यह मानते हुए कि पाठकों को शुरू करने से पहले शब्दकोश शुरू किया गया है)? – RayLuo

+0

एक शब्दकोश के लिए, हाँ, एरिक लिपर्ट का जवाब खड़ा है। मेरी टिप्पणी से याद रखने की महत्वपूर्ण बात यह है कि सामान्य रूप से, यह मानने के लिए पर्याप्त नहीं है कि डेटा संरचना थ्रेडसेफ है यदि आप केवल उस पर पढ़ते हैं, क्योंकि आप नहीं जानते कि पठन आंतरिक स्थिति को कैसे प्रभावित करता है। शब्दकोश के मामले में, यह पता चला है कि पढ़ने के संचालन वास्तव में तब तक सुरक्षित हैं जब तक कोई भी इसे कभी नहीं लिखता है, जबकि समवर्ती पाठक इसका उपयोग कर रहे हैं। तो आपके उदाहरण में, जहां आप इसे एक बार शुरू करते हैं, और फिर केवल इससे पढ़ते हैं, आप सुरक्षित हैं। स्पष्टीकरण के लिए – JMarsch

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