2012-05-17 7 views
22

MSDN के अनुसार:अस्थिर अपनी मुख्य नौकरी का उल्लंघन करता है?

अस्थिर कीवर्ड इंगित करता है कि एक क्षेत्र से अधिक थ्रेड कि एक ही समय में क्रियान्वित कर रहे हैं द्वारा संशोधित किया जा सकता है। फ़ील्ड जो घोषित अस्थिर संकलक अनुकूलन के अधीन नहीं हैं एक थ्रेड द्वारा पहुंच मानें। यह सुनिश्चित करता है कि सबसे अधिक अप-टू-डेट मान फ़ील्ड में हर समय मौजूद है।

कृपया अंतिम वाक्य नोटिस:

यह सुनिश्चित करता है कि सबसे अप-टू-डेट मूल्य हर समय क्षेत्र में मौजूद है।

हालांकि, इस कीवर्ड के साथ कोई समस्या है।

मैंने read यह निर्देश का क्रम बदल सकते हैं कि:

First instruction  Second instruction   Can they be swapped? 
Read       Read       No 
Read       Write      No 
Write      Write       No 
Write      Read       Yes! <---- 

यह जॉन का मतलब है एक अस्थिर क्षेत्र के लिए एक मूल्य निर्धारित करता है, और बाद में पॉल क्षेत्र को पढ़ने के लिए चाहता है, पॉल पुराना मूल्य प्राप्त कर रहा है!

यहां क्या हो रहा है? क्या यह मुख्य काम नहीं है?

मुझे पता है कि अन्य समाधान भी हैं, लेकिन मेरा प्रश्न अस्थिर कीवर्ड के बारे में है।

क्या मुझे (प्रोग्रामर के रूप में) इस कीवर्ड का उपयोग करने से रोकने की आवश्यकता है - इस तरह के अजीब व्यवहार की वजह से?

+1

यह तालिका कहां से है? – Corbin

+0

@ कोरबिन 'ive read' लिंक पर दबाएं। –

+0

आह ठीक है। यह तब समझ में आता है। एक सेकंड और मैं विस्तृत करूंगा। संपादित करें: ठीक है, मैं इसे वापस लेता हूं। यह मेरे सिर में समझ में आता है, लेकिन मैं इसे समझा नहीं सकता>। <। – Corbin

उत्तर

7

एमएसडीएन दस्तावेज गलत है। यह निश्चित रूप से नहीं है कि volatile करता है। सी # विनिर्देश आपको बताता है कि volatile क्या करता है और "ताजा पढ़ा" या "प्रतिबद्ध लेखन" प्राप्त करना उनमें से एक नहीं है। विनिर्देश सही है। volatile केवल लिखने पर लिखने और रिलीज-बाड़ पर अधिग्रहण-बाड़ की गारंटी देता है। ये नीचे के रूप में परिभाषित हैं।

  • अधिग्रहण-बाड़: एक स्मृति बाधा है, जिसमें अन्य रीड और राईट बाड़ से पहले स्थानांतरित करने के लिए अनुमति नहीं है।
  • रिलीज-बाड़: बाड़ के बाद स्थानांतरित करने के लिए एक मेमोरी बाधा जिसमें अन्य पढ़ता है और लिखने की अनुमति नहीं है।

मैं अपने तीर नोटेशन का उपयोग कर तालिका को समझाने की कोशिश करूंगा। एक ↓ तीर एक अस्थिर पढ़ने को चिह्नित करेगा और एक तीर एक अस्थिर लेखन को चिह्नित करेगा। तीरहेड के माध्यम से कोई निर्देश नहीं जा सकता है। सब कुछ दूर धकेलने के रूप में तीरहेड के बारे में सोचो।

निम्नलिखित विश्लेषण में मैं चर के लिए उपयोग करूंगा; x और y। मैं यह भी मानूंगा कि उन्हें volatile के रूप में चिह्नित किया गया है।

प्रकरण # 1

सूचना कैसे x के पढ़ने के बाद तीर के स्थान ऊपर आने के y के पढ़ने से बचाता है। यह भी ध्यान दें कि y की अस्थिरता इस मामले में अप्रासंगिक है।

var localx = x; 
↓ 
var localy = y; 
↓ 

प्रकरण # 2

सूचना कैसे x के पढ़ने के बाद तीर के स्थान ऊपर आने के y को लिखने से रोकता है। यह भी ध्यान दें कि x या y की अस्थिरता, लेकिन दोनों नहीं, इस मामले में छोड़ी जा सकती थीं।

var localx = x; 
↓ 
↑ 
y = 1; 

प्रकरण # 3

सूचना कैसे y को लिखने से पहले तीर के स्थान नीचे जाने से x को लिखने से रोकता है। ध्यान दें कि x की अस्थिरता इस मामले में अप्रासंगिक है।

↑ 
x = 1; 
↑ 
y = 2; 

प्रकरण # 4

सूचना x को लिखने और y के पढ़ने के बीच कोई बाधा नहीं है। इस वजह से या तो x पर लिखा जा सकता है या y के पढ़ने के लिए तैर सकते हैं। या तो आंदोलन वैध है। यही कारण है कि लिखने के मामले में निर्देशों को बदला जा सकता है।

↑ 
x = 1; 
var localy = y; 
↓ 

उल्लेखनीय उल्लेख किए जाने पर

यह भी ध्यान रखें कि महत्वपूर्ण है:

  • 86 हार्डवेयर राईट पर अस्थिर अर्थ विज्ञान है।
  • माइक्रोसॉफ्ट के सीएलआई के कार्यान्वयन (और संदिग्ध मोनो के साथ-साथ) लिखने पर अस्थिर अर्थशास्त्र है।
  • ईसीएमए विनिर्देश लिखने पर अस्थिर अर्थशास्त्र है।
+0

मुझे पता है, इस विषय के बारे में मेरा प्रश्न देखें http://stackoverflow.com/questions/10589654/half-fences-and-full-fences –

+0

hhh आपने इसका उत्तर पहले से ही ..... lol। मुझे जवाब देने से पहले मुझे कुछ और ज्ञान की जांच करने की ज़रूरत है .... (लिंक प्रश्न के लिए) –

+0

@ रॉयनामिर: [इस] (http://stackoverflow.com/q/10281044/158779) प्रश्न पर एक नज़र डालें जहां मैं तीर नोटेशन का उपयोग करके डबल-चेक किए गए लॉकिंग पैटर्न का विश्लेषण करता हूं। तीर नोटेशन वास्तव में मदद करता है कि क्या हो सकता है और क्या नहीं हो सकता है। –

18

ठीक है आप सही हैं। यह यूसुफ अल्बहारी थ्रेडिंग book/article में अधिक विस्तृत है।

MSDN प्रलेखीकरण राज्यों अस्थिर कीवर्ड के उपयोग सुनिश्चित करता है कि कि सबसे अप-टू-डेट मूल्य हर समय क्षेत्र में मौजूद है। यह गलत है, जैसा कि हमने देखा है, एक पाठ के बाद एक पाठ को फिर से व्यवस्थित किया जा सकता है।

http://www.albahari.com/threading/part4.aspx#_The_volatile_keyword

मैं (एक प्रोग्रामर के रूप में) इस कीवर्ड-क्योंकि इस तरह अजीब व्यवहार का उपयोग करते हुए को रोकने के लिए की जरूरत है चाहिए?

इसका उपयोग केवल इस कमजोर व्यवहार को जानने के बाद किया जाना चाहिए। मल्टीथ्रेडेड वातावरण में हर समय नवीनतम मूल्यों को पुनर्प्राप्त करने के लिए इसे जादू कीवर्ड के रूप में उपयोग नहीं किया जाना चाहिए।

आईएमओ, अस्थिर कीवर्ड का उपयोग टालना चाहिए क्योंकि संभावित बग को खोजने में मुश्किल होती है।

+3

इस अजीब व्यवहार को क्यों नहीं लिखता है? मुझे जोसेफ से यह सुनने की ज़रूरत क्यों है? –

+4

मुझे नहीं पता। एमएसडीएन विभिन्न स्थानों पर वास्तव में गलत है। मैं उपयोगकर्ता टिप्पणियों को इंगित कर सकता हूं। यूसुफ के लेख में, निष्कर्ष को उपयुक्त उदाहरण द्वारा समर्थित किया गया है जिसे आप स्वयं को आजमा सकते हैं। आपके द्वारा लिंक किए गए पोस्ट में – Tilak

4

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

चूंकि आपको शायद यह पता नहीं चलेगा कि आपका आवेदन किस प्रकार का सिस्टम उत्पादन में चल रहा है, हमेशा अस्थिर कीवर्ड से बचने के लिए सबसे अच्छा है।

भी थोड़ा विषय आप हमेशा मल्टीप्रोसेसर सिस्टम पर भारी बोझ के नीचे के रूप में ReaderWriterLock वर्ग से बचना चाहिए इसे एक से अधिक लिखने ताले please see here एक साथ ले जाया जा रहा है, जिसमें आवेदन रुक जाता है जो मूल कारण के लिए बेहद मुश्किल होगा कारण होगा अनुमति दे सकते हैं बंद

+0

'रीडरवाइटर लॉकस्लिम' का भी उल्लेख किया गया है, शायद यहां उल्लेख करने के लिए सबसे अच्छा है। –

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