10

के उपयोग के आसपास कुछ प्रश्न मैं वर्तमान में एक सी # आवेदन लिख रहा हूं। मैं एक ConcurrentDictionary का उपयोग करने के लिए नया हूँ इसलिए इसकी धागा सुरक्षा के आसपास कुछ सवाल हैं।ConcurrentDictionary

/// <summary> 
    /// A dictionary of all the tasks scheduled 
    /// </summary> 
    private ConcurrentDictionary<string, ITask> tasks; 

मैं मेरी कक्षा में इस दृष्टांत और मेरी वस्तुओं कि ITask लागू के सभी ट्रैक करने के लिए इसका इस्तेमाल करते हैं: सबसे पहले, यह मेरा शब्दकोश है। मैं यह सुनिश्चित करना चाहता हूं कि मेरा सेटअप एक बहु थ्रेडेड वातावरण में सही ढंग से काम करेगा।

यदि एकाधिक थ्रेड ConcurrentDictionary में आइटम्स की संख्या की गिनती प्राप्त करना चाहते हैं, तो क्या मुझे इसे लॉक करने की आवश्यकता है?

यदि मैं शब्दकोश से एक विशेष कुंजी प्राप्त करना चाहता हूं, तो उस कुंजी का ऑब्जेक्ट प्राप्त करें और उस पर एक विधि कॉल करें, क्या मुझे इसे लॉक करने की आवश्यकता है? उदाहरण के लिए:

/// <summary> 
    /// Runs a specific task. 
    /// </summary> 
    /// <param name="name">Task name.</param> 
    public void Run(string name) 
    { 
     lock (this.syncObject) 
     { 
      var task = this.tasks[name] as ITask; 
      if (task != null) 
      { 
       task.Execute(); 
      } 
     } 
    } 

मन रखते हुए एक से अधिक थ्रेड भागो विधि ITask की विधि निष्पादित फोन करने के लिए देख कह सकते हैं। मेरा उद्देश्य सब कुछ थ्रेड सुरक्षित और जितना संभव हो उतना कलाकार होना है।

उत्तर

9

तरीकों और ConcurrentDictionary के गुणों themself पूरी तरह से सुरक्षित थ्रेड रहे हैं:

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

कुंजी-मान जोड़ों कि से अधिक थ्रेड समवर्ती द्वारा पहुँचा जा सकता है की एक धागा सुरक्षित संग्रह का प्रतिनिधित्व करता है।

यह Count संपत्ति में शामिल हैं:

गणना स्नैपशॉट अर्थ विज्ञान है और इस समय ConcurrentDictionary में आइटमों की संख्या का प्रतिनिधित्व करता है जब गणना पहुँचा था।

हालांकि इस नहीं मतलब है कि वस्तुओं शब्दकोश के अंदर आयोजित खुद को सुरक्षित थ्रेड हैं करता है। यही है, एक ही Task ऑब्जेक्ट तक पहुंचने और Execute विधि को चलाने की कोशिश करने से दो धागे को रोकना कुछ भी नहीं है।आप चाहते हैं धारावाहिक (लॉक) Execute विधि के लिए प्रत्येक व्यक्ति के कार्य करने के लिए उपयोग करना चाहते, तो मैं एक ताला वस्तु Task अंदर होने और लॉकिंग का सुझाव देते हैं, तो जब Execute चल:

public class Task 
{ 
    private object _locker = new object(); 

    public void Execute() 
    { 
     lock (_locker) { 
      // code here 
     } 
    } 
} 

यह है कि कम से कम हर व्यक्ति काम नहीं करता है सुनिश्चित करता है Execute चल रहे एकाधिक थ्रेड नहीं हैं। मैं अनुमान लगा रहा हूं कि आप प्रश्न के संदर्भ और कक्षाओं और विधियों के नाम से क्या कर रहे हैं।

+0

'.count' संपत्ति थ्रेड सुरक्षित है? या 'गणना()' विधि? अंतर क्या है? – Zapnologica

2

ConcurrentDictionary के सभी विधियां एकाधिक धागे से सुरक्षित हैं।

यह गारंटी नहीं देता है कि आपके प्रोग्राम के अन्य हिस्सों को सिंक्रनाइज़ेशन की आवश्यकता नहीं है क्योंकि आपको एक ही समय में अन्य ऑब्जेक्ट/एकाधिक ऑब्जेक्ट्स तक पहुंचने के लिए ताले का उपयोग करने की आवश्यकता हो सकती है।

आईई। आपका नमूना कोड किसी कार्य को पुनर्प्राप्त करने और इसे निष्पादित करने के लिए लॉक करता है। यह परमाणु रूप से एकाधिक ऑब्जेक्ट तक पहुंचने के लिए लॉकिंग का एक उदाहरण दिखाता है।

साइड नोट: आपको task.Execute() के लिए अपने लॉक की समीक्षा करनी चाहिए क्योंकि यह समानांतर में कार्य निष्पादित करने के लिए अन्य धागे को प्रतिबंधित करता है। यह हो सकता है कि आप जो हासिल करना चाहते हैं, लेकिन इस मामले में ConcurrentDictionary का उपयोग करना अधिक हो सकता है।

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