2009-07-20 14 views
18

सी # में कुछ आदिम प्रकारों को पढ़ता है और लिखता है जैसे bool और int परमाणु हैं।सी # में परमाणु गुणों को पढ़ता है और लिखता है?

(खंड 5.5, "वैरिएबल संदर्भ का 5.5 Atomicity", सी # भाषा युक्ति में देखें।)

लेकिन के बारे में क्या गुण के माध्यम से इस तरह के चर तक पहुँचने? क्या यह मानना ​​उचित है कि वे परमाणु और थ्रेड-सुरक्षित भी होंगे? जैसे नीचे दिए गए परमाणु और धागे की सुरक्षित ?:

public bool MyProperty { get { return _foo; } } 

MyProperty की एक पढ़ सकते हैं और क्या ऑटो कार्यान्वित गुणों के बारे में है? वे सरल प्राप्त/एक उत्पन्न क्षेत्र के लिए सेट कर रहे हैं -

public bool MyProperty { get; } 
+0

मैं इस अपने आप को थोड़ी देर के लिए पूछने के लिए अर्थ किया गया है ... मैं सिर्फ अनुमान लगा रही है, इसलिए मैं इसे एक जवाब में डाल नहीं होगा , लेकिन अगर ऑटो-प्रॉपर्टी परमाणु हैं तो यह मुझे आश्चर्य नहीं करेगा। शायद कुछ और नहीं है। –

उत्तर

28

आपको "परमाणु" और "थ्रेड-सुरक्षित" के बीच अधिक बारीकी से अंतर करने की आवश्यकता है। जैसा कि आप कहते हैं, लिखते हैं अधिकांश अंतर्निहित मूल्य प्रकारों और संदर्भों के लिए परमाणु हैं।

हालांकि, इसका मतलब यह नहीं है कि वे थ्रेड-सुरक्षित हैं। इसका मतलब यह है कि यदि मूल्य "ए" और "बी" दोनों लिखे गए हैं, तो एक थ्रेड बीच में कुछ नहीं देखेगा। (उदाहरण के लिए 1 से 4 में कोई बदलाव 5, या 2, या 1 या 4 के अलावा कोई भी मूल्य नहीं दिखाएगा।) यह का अर्थ यह नहीं है कि एक थ्रेड वैरिएबल को लिखा गया है जैसे ही "बी" मान दिखाई देगा। इसके लिए, आपको अस्थिरता के मामले में मेमोरी मॉडल को देखने की आवश्यकता है। स्मृति बाधाओं के बिना, आमतौर पर लॉकिंग और/या अस्थिर चर के माध्यम से प्राप्त किया जाता है, मुख्य स्मृति को लिखने में देरी हो सकती है और पढ़ना उन्नत हो सकता है, प्रभावी ढंग से यह मानते हुए कि पिछले पढ़ने के बाद से मूल्य नहीं बदला है।

आप एक काउंटर था और आप अपनी नवीनतम मूल्य के लिए यह पूछा लेकिन कभी स्मृति बाधाओं की कमी की वजह से नवीनतम मूल्य प्राप्त हुआ है, मुझे नहीं लगता कि आप यथोचित कह सकते हैं कि धागे की सुरक्षित भी प्रत्येक ऑपरेशन हालांकि अच्छी तरह से परमाणु हो सकता है।

इसका गुणों के साथ कुछ लेना देना नहीं है, हालांकि - संपत्तियां उनके आसपास सिंटैक्टिक चीनी के साथ बस विधियां हैं। वे थ्रेडिंग के आसपास कोई अतिरिक्त गारंटी नहीं देते हैं। .NET 2.0 मेमोरी मॉडल ईसीएमए मॉडल की तुलना में अधिक गारंटी देता है, और यह संभव है कि यह विधि प्रविष्टि और बाहर निकलने के लिए गारंटी देता है। उन गारंटीयों को गुणों पर भी लागू होना चाहिए, हालांकि मैं ऐसे नियमों की व्याख्या के आसपास घबराहट करूँगा: कभी-कभी स्मृति मॉडल के बारे में तर्क करना बहुत मुश्किल हो सकता है।

+0

धन्यवाद। मैंने माना कि "परमाणु" हर जगह परमाणु था, जिसमें थ्रेड भी शामिल थे। यही शब्द मुझे सुझाया गया है। वास्तव में थ्रेडिंग खतरे से भरा हुआ है। –

1

आप स्वत: जनरेट कोड की जांच, तो आप उस स्वत: जनरेट गुण नहीं धागा सुरक्षित हैं देखेंगे। वास्तव में, ऐसा करने के लिए प्रदर्शन प्रदर्शन का बहुत अधिक होगा (विशेष रूप से जब आवश्यक नहीं)।

इसके अलावा, यदि आप एकाधिक धागे से पहुंच int/bool मानों पर पहुंचने की योजना बना रहे हैं तो आपको इसे (फ़ील्ड) volatile के रूप में चिह्नित करना चाहिए। यह मूल रूप से सीपीयू रजिस्टरों से संबंधित मल्टीथ्रेडिंग मुद्दों को रोकता है। (यह में को लॉक करने के लिए अतिरिक्त विकल्प नहीं है)

+8

यह गलत है। आप थ्रेड के बीच दृश्यता के साथ स्मृति की परमाणुता को भ्रमित कर रहे हैं। मूल int से कम आकार वाले चर के सभी पढ़ने/लिखने परमाणु होने की गारंटी दी जाती है। अधिक जानकारी के लिए सीएलआई भाषा स्पेक की धारा 12.6.6 देखें। – JaredPar

+0

आप सही हैं - मेरा मतलब धागा सुरक्षित था (परमाणु नहीं)। सुबह में इतनी जल्दी जवाब देने के लिए मुझे सही काम करता है;) –

+0

@ रिचर्ड, सुबह में मैं अक्सर एसओ से दूर रहता हूं जब तक कि मैंने अपनी कॉफी के लिए अपनी कॉफी पूरी नहीं की है। या कम से कम मेरे प्रतिनिधि :) – JaredPar

0

मुझे नहीं लगता। गुण अनिवार्य रूप से केवल उन तरीकों के साथ विधियों के साथ हैं जिनके साथ काम करने के लिए उन्हें थोड़ा आसान बनाने के लिए। तो डिफ़ॉल्ट रूप से वे सामान्य विधि कॉल से अधिक थ्रेड-सुरक्षित नहीं होते हैं (जो कहने के लिए, थ्रेड-सुरक्षित नहीं है)।

2

मैं थोड़ा पूछताछ कर रहा हूं कि आप यहां क्या पूछ रहे हैं। ऐसा लगता है कि आप 1 में से 2 प्रश्न पूछ सकते हैं

  1. माइप्रोपर्टी परमाणु को कॉल करते समय _foo का पढ़ना है?
  2. क्या मायप्रोपर्टी का वापसी मूल्य परमाणु रूप से सेट है?

# 1 के लिए उत्तर हाँ है। चूंकि सी # भाषा का नमूना (और सीएलआई) कहता है, कुछ निश्चित प्रकार के चर के पढ़ने और लिखने परमाणु होने की गारंटी है। प्रकार 'बूल' उन प्रकारों में से एक है।

# 2 के लिए सीएलआई स्पेक की धारा 12.6.6 देखने के लिए सबसे अच्छी जगह है। यह कहा गया है कि

एक अनुरूप CLI कि पढ़ने और लिखने का उपयोग ठीक से स्मृति स्थल के कोई मूल शब्द आकार (प्रकार देशी पूर्णांक का आकार) से भी बड़ा गठबंधन करने की गारंटी करेगा परमाणु

उपयोग करने के लिए विचार कर रहा है MyProperty का वापसी मूल्य आपको या तो मूल्य पढ़ना या लिखना होगा, यह मानना ​​सुरक्षित है कि यह परमाणु रूप से सेट है।

1

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

थ्रेड-सुरक्षा के लिए आपको लॉकिंग (या अस्थिर, लेकिन यह कारणों के लिए कठिन है) का उपयोग करने की आवश्यकता है। गुणों के बारे में कुछ खास नहीं है - उन्हें स्पष्ट रूप से थ्रेड-सुरक्षित भी बनाया जाना चाहिए।

0

तो आप प्रॉपर्टी में कुछ भी रख सकते हैं, जैसे

Public Property foo() As Boolean 
     Get 
      goToLunch() 
      barbecueRibs() 
      return m_foo 
     End Get 
     Set(ByVal value As Boolean) 
      takeANap() 
      accessDatabase() 
      messUpOtherVariables() 
      m_foo = value 
     End Set 
    End Property 
संबंधित मुद्दे