2010-11-26 11 views
23

मेरे पास एक स्थिर रीडोनली शब्दकोश है। कोई इस शब्दकोश में संशोधन किए जाएंगे।केवल पढ़ने के लिए - एकाधिक थ्रेड कॉलिंग। कॉन्टैन्सकी विधि

मेरे पास .ContainsKey (Key) का उपयोग करके इस शब्दकोश से कई धागे पढ़ रहे हैं। जैसे

class MyData 
{ 
    private static private IDictionary<int, string> _dictionary = new Dictionary<int, string>(); 

    MyData() 
    { 
     // Load Dictionary here 
    } 

    public string GetValue(int key) 
    { 
     if (_dictionary.ContainsKey(key)) 
     { 
      return _dictionary[key]; 
     } 
    } 
} 

क्या ऐसा करने में कोई थ्रेडिंग समस्या है?

उत्तर

19

यदि कोई इसे उत्परिवर्तित नहीं कर रहा है: यह ठीक है। यदि कभी-कभी संपादन थे, तो शायद रीडरवाइटर लॉकस्लिम देखें, या (मेरी प्राथमिकता) स्नैपशॉट/प्रतिलिपि संपादित करें और संदर्भ को स्वैप करें।

+0

इस्तेमाल कर सकते हैं लेकिन आप अभी भी आवश्यकता होगी संदर्भ को स्वैप करते समय रीडरवाइटर लॉकस्लिम, है ना? –

+1

@ मार्क: एक संदर्भ लिखना परमाणु होने की गारंटी है, लेकिन मुझे लगता है कि आप संभवतः फ़ील्ड 'अस्थिर' को चिह्नित करना चाहते हैं ताकि यह सुनिश्चित किया जा सके कि कोई अन्य धागा परिवर्तन को देख सके। – LukeH

+0

मुझे लगता है कि मैं सोच रहा था कि यदि आप ContainsKey विधि चलाने के बीच में संदर्भ को स्वैप करते हैं तो यह समस्याएं पैदा कर सकता है? –

3

यदि आप केवल पढ़ने जा रहे हैं तो यह सुरक्षित है।

1

यदि एकाधिक थ्रेड से पढ़ने से पहले सभी 'जोड़ना' पूरा हो गया है तो यह ठीक है। सिर्फ इसलिए कि इसका रीडोनली इसका मतलब सुरक्षित नहीं है - जो यह नहीं है।

शायद तुम उपयोगकर्ता ReaderWriterLock पहुँच सिंक्रनाइज़ करने के लिए करना चाहिए

2

आप एक ही समय में डेटा लेखन तो कर रहे थे करने के लिए किया जा (और आप .NET 4.0 उपयोग कर रहे थे) तो आप ConcurrentDictionary

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