2010-06-15 12 views
21

मुझे पता है कि .NET में सभी 32-बिट प्रकार (उदाहरण के लिए, int, bool, आदि) थ्रेड सुरक्षित हैं। यही है, आंशिक लेखन नहीं होगा (विनिर्देशों के अनुसार)।int है? सुरक्षित धागा?

लेकिन, क्या यह int? (शून्य रहित int) के लिए भी लागू होता है?

उत्तर

38

प्रश्न खराब शब्दों में है, और इसलिए अब तक जवाब में भ्रम है। सवाल होना चाहिए "टाइप int के एक चर के लिए पढ़ और लिखते हैं? परमाणु होने की गारंटी है?"

नहीं, बिल्कुल नहीं। कल्पना इस मुद्दे पर बेहद स्पष्ट है:

पढ़ता है और निम्न डेटा प्रकारों के बारे में लिखते परमाणु कर रहे हैं: bool, चार, बाइट, sbyte, लघु, ushort, uint, int, नाव, और संदर्भ प्रकार के। इसके अलावा, पिछली सूची में अंतर्निहित प्रकार के साथ enum प्रकारों के पढ़ने और लिखने पर भी परमाणु हैं। लंबे, उलझन, डबल, और दशमलव, साथ ही उपयोगकर्ता द्वारा परिभाषित प्रकार सहित अन्य प्रकार के पढ़ और लिखते हैं, परमाणु होने की गारंटी नहीं है।

थ्रेड के लिए यह पूरी तरह से संभव है कि नालीबल प्रकार के साझा-मेमोरी चर से आंशिक रूप से लिखित मान पढ़ा जाए।

उदाहरण के लिए, मान लीजिए कि आपके पास int है? परिवर्तनीय एक्स जो वर्तमान में मूल्य शून्य है। इसलिए इसमें एक int, शून्य पर सेट होता है, और एक बूल, गलत पर सेट होता है। अब एक और धागे पर आप शून्य के लिए शून्य "int" लिखते हैं। यह किसी अन्य थ्रेड के लिए x से गैर-शून्य से int शून्य को पढ़ने के लिए पूरी तरह से कानूनी है, क्योंकि 5 में int "सेट" सेट को सेट करने से पहले सेट किया जा सकता है।

+0

मैं int के लिए आपका उदाहरण समझता हूं? .. लेकिन लंबे, डबल और दशमलव परमाणु नहीं पढ़ते/लिखते हैं क्यों? – MalcomTucker

+0

@ माल्कॉम टकर: 32 बिट प्रोसेसर केवल गारंटी देता है कि चर पर ऑपरेशन 32 बिट्स पर परमाणु हैं। लंबे, डबल और दशमलव को पूरे मान को लिखने या पढ़ने के लिए एक से अधिक ऑपरेशन की आवश्यकता हो सकती है क्योंकि वे 32 बिट्स से बड़े होते हैं। –

+0

@ मैल्कम टकर: http://msdn.microsoft.com/en-us/library/system.threading.interlocked_members.aspx युगल और अन्य प्रकारों पर परमाणु संचालन करने की क्षमता प्रदान करने की कार्यक्षमता प्रदान करता है। – Brian

12

नहीं है, के बाद से एक int? वास्तव में एक struct (Nullable<int>) एक int और एक bool से बना है।

+2

@Eric: लेकिन, रूपांतरण ऑपरेटरों को छोड़कर, 'न्यूबल योग्य ' पर कोई सार्वजनिक स्थैतिक सदस्य नहीं हैं। – LukeH

+0

@LukeH: इस सवाल के साथ क्या करना है? –

+1

@Eric: मेरी टिप्पणी किसी अन्य एरिक द्वारा बनाई गई एक पूर्व टिप्पणी (हटाए जाने के बाद) के जवाब में थी, दावा करते हुए कि 'int?' प्रकार के कुछ सदस्य - सार्वजनिक स्थिर सदस्य - थ्रेड-सुरक्षित थे। – LukeH

3

http://msdn.microsoft.com/en-us/library/b3h38hb0.aspx से:

किसी भी सार्वजनिक स्थिर इस प्रकार के सदस्यों (विजुअल बेसिक में साझा) धागा सुरक्षित हैं। कोई भी इंस्टेंस सदस्यों को थ्रेड सुरक्षित होने की गारंटी नहीं है।

+5

समस्या यह है कि 'Nullable ' के पास कोई सार्वजनिक स्थैतिक सदस्य नहीं है (जब तक कि आप रूपांतरण ऑपरेटरों को 'टी' से ही नहीं मानते)। यह सिर्फ बॉयलरप्लेट टेक्स्ट है जो आपको एमएसडीएन पर अधिकांश ऑब्जेक्ट्स के लिए प्रलेखन में मिलेगा। – LukeH

+3

क्या तथ्य यह है कि यह सामान्य दस्तावेज प्रतिलिपि है इसे कम सटीक बनाते हैं? –

+1

.. कम से कम कम से कम :) – Rusty

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