2012-12-03 16 views
6

मैं सी # में Volatile कीवर्ड का वास्तविक समय उपयोग देखना चाहता हूं। लेकिन सबसे अच्छा उदाहरण प्रोजेक्ट करने में असमर्थ हूं। नीचे नमूना कोड Volatile कीवर्ड के बिना काम करता है यह कैसे संभव हो सकता है?सी # में अस्थिर कीवर्ड उद्देश्य क्या है?

class Program 
{ 
    private static int a = 0, b = 0; 

    static void Main(string[] args) 
    { 
     Thread t1 = new Thread(Method1); 
     Thread t2 = new Thread(Method2); 

     t1.Start(); 
     t2.Start(); 

     Console.ReadLine(); 
    } 

    static void Method1() 
    { 
     a = 5; 
     b = 1; 
    } 

    static void Method2() 
    { 
     if (b == 1) 
      Console.WriteLine(a); 
    } 
} 

उपरोक्त कोड में मुझे 5 के रूप में मूल्य मिल रहा है। यह अस्थिर कीवर्ड का उपयोग किए बिना कैसे काम करता है?

+1

यह काम नहीं करता है। चूंकि आप 'अस्थिर' का उपयोग करना भूल गए हैं, तो आप 5 से कम कुछ मूल्य प्राप्त करने की उम्मीद करते हैं। फिर भी आपको 5 मिलते हैं। तो यह * काम नहीं कर रहा है, जो आप कुछ छोड़ने की अपेक्षा करेंगे। (बग को ठीक करें और रहस्य दूर हो जाएगा। थ्रेडिंग बग के साथ कोड समझना लगभग असंभव है। बस उन्हें ठीक करें और इसके बारे में भूल जाओ।) –

+0

क्या आप मुझे अस्थिरता के लिए एक बेहतरीन उदाहरण बता सकते हैं? – Gun

+0

अब, बिना किसी 'अस्थिर' कीवर्ड के, कोई ** गारंटी ** नहीं है कि प्रोग्राम '0' आउटपुट नहीं करेगा। यह (कुछ दिन) आउटपुट '0' हो सकता है। यदि आप 'अस्थिर' कीवर्ड जोड़ते हैं, तो यह '0' आउटपुट नहीं कर सकता है, यह केवल _either_ आउटपुट _or_ '5' दे सकता है। –

उत्तर

11

volatile कीवर्ड संकलक को बताता है कि एक चर किसी भी समय बदल सकता है, इसलिए इसे चर के पढ़ने और लिखने को अनुकूलित नहीं करना चाहिए।

इस तरह कोड पर विचार करें:

int sum; 
for (var i = 0; i < 1000; i++) { 
    sum += x * i; 
} 

चर x के रूप में, लूप के अंदर परिवर्तन नहीं करता है संकलक पाश के बाहर एक बार चर पढ़ सकता है और सिर्फ पाश भर एक जैसा उपयोग करें।

यदि आप परिवर्तनीय x अस्थिर बनाते हैं, तो संकलक हर बार चर के मान को पढ़ेगा, इसलिए यदि आप किसी भिन्न थ्रेड में मान बदलते हैं, तो नया मान तुरंत उपयोग किया जाएगा।

2

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

समझना कि थ्रेडिंग दौड़ के साथ कोड विफल रहता है या विफल नहीं होता है, कार्यान्वयन और प्लेटफॉर्म की गहरी समझ की आवश्यकता होती है। यह आसान नहीं है और आमतौर पर चिंता करने योग्य नहीं है। बस नियमों का पालन करें और आपका कोड हर समय काम करेगा।

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