2009-01-08 12 views
38

निम्नलिखित कोडनिहितार्थ

using System.Threading; 

class Test 
{ 
    volatile int counter = 0; 
    public void Increment() 
    { 
     Interlocked.Increment(ref counter); 
    } 
} 

वृद्धि निम्नलिखित संकलक चेतावनी "एक अस्थिर क्षेत्र के लिए एक संदर्भ के रूप में अस्थिर नहीं माना जाएगा" चेतावनी? संकलक मुझे इस बारे में चेतावनी क्यों देता है?

उत्तर

39

आप कुछ भी गलत नहीं कर रहे हैं। documentation के अनुसार:

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

+18

मैं कहूंगा कि इंटरलाक्ड विधियां अभी भी किसी अन्य क्षेत्र के साथ किसी भी तरह से इसका इलाज नहीं कर रही हैं - यह सिर्फ इतना है कि * सभी * फ़ील्ड इंटरलाक्ड द्वारा विशेष तरीके से संभाले जाते हैं। –

+3

सहमत हुए। अस्थिर इंटरलॉक एपीआई के लिए अप्रासंगिक है। लेकिन कुछ मामलों में, इंटरलाक्ड और अस्थिर मिश्रण करना बहुत उपयोगी है। – IamIC

+0

पार्टी के लिए थोड़ा देर हो चुकी है, लेकिन @IAMIC: विस्तार से देखभाल करने के लिए कौन से मामले होंगे? – jajdoo

3

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

30

मूल रूप से चेतावनी यह है कि जब आप संदर्भ द्वारा अस्थिर क्षेत्र पास करते हैं, तो कॉलिंग कोड को अस्थिर तरीके से इसका इलाज करने के बारे में पता नहीं होता है। Interlocked.Increment के लिए जो संभवतः कोई फर्क नहीं पड़ता, विधि की प्रकृति के कारण - लेकिन फिर आप इंटरलॉक का उपयोग कर रहे हैं तो वैरिएबल वैसे भी होने की आवश्यकता नहीं है।

आम तौर पर, मुझे लगता है कि मैं दो मिश्रणों से बचने से बचूंगा - अगर आप इंटरलाक्ड का उपयोग कर रहे हैं, तो इसे हर जगह (इसे पढ़ने के लिए Interlocked.CompareExchange(ref counter, 0, 0) का उपयोग करके) करें। मैं नहीं कह सकता कि मैं अक्सर व्यक्तिगत रूप से अस्थिरता का उपयोग करता हूं। सरल काउंटर के लिए I इंटरलाक्ड का उपयोग कर सकता है, लेकिन अधिकांश कार्यों के लिए मुझे लॉक का उपयोग करने की अधिक संभावना है।

+0

तुम मुझे उलझन में हो रही है। पिछले प्रश्न (3 9 5232) में मैंने आपके जवाब से समझा कि मुझे इंटरलाक्ड और अस्थिर दोनों की आवश्यकता है। अब आप कहते हैं, "यदि आप इंटरलाक्ड का उपयोग कर रहे हैं तो आपको वैरिएबल की अस्थिरता की आवश्यकता नहीं है।" –

+0

नहीं, वे एक-दूसरे के विकल्प हैं: "या अधिमानतः इंटरलाक्ड, एक अस्थिर चर या लॉक का उपयोग करें।" यह तीन * अलग * दृष्टिकोण देने के लिए था, संयुक्त नहीं। क्या वह हिस्सा था जो आपको गुमराह कर रहा था? –

+0

मैं समझता हूं कि एक मल्टीप्रोसेसर वातावरण में, कई कैश एक प्रोसेसर को एक कैश किए गए मान को बढ़ा सकते हैं जो अंतिम मूल्य नहीं है। उस स्थिति में, जहां तक ​​मुझे पता है, एक इंटरलाक्ड मदद नहीं करेगा, क्योंकि यह कैश को रीफ्रेश करने के लिए मेमोरीबैरियर बनाता है। –

26

इस का उपयोग करें:

 #pragma warning disable 420 
     //      M 
     //      dM 
     //      MMr 
     //      4MMML     . 
     //      MMMMM.    xf 
     //  .    "MMMMM    .MM- 
     //  Mh..   +MMMMMM   .MMMM 
     //  .MMM.   .MMMMML.   MMMMMh 
     //  )MMMh.  MMMMMM   MMMMMMM 
     //  3MMMMx.  'MMMMMMf  xnMMMMMM" 
     //  '*MMMMM  MMMMMM.  nMMMMMMP" 
     //   *MMMMMx "MMMMM\ .MMMMMMM= 
     //   *MMMMMh "MMMMM" JMMMMMMP 
     //    MMMMMM 3MMMM. dMMMMMM   . 
     //    MMMMMM "MMMM .MMMMM(  .nnMP" 
     // =..   *MMMMx MMM" dMMMM" .nnMMMMM* 
     // "MMn...  'MMMMr 'MM MMM" .nMMMMMMM*" 
     //  "4MMMMnn.. *MMM MM MMP" .dMMMMMMM"" 
     //  ^MMMMMMMMx. *ML "M .M* .MMMMMM**" 
     //   *PMMMMMMhn. *x > M .MMMM**"" 
     //    ""**MMMMhx/.h/ .=*" 
     //      .3P"%.... 
     //     nP"  "*MMnx 
     if(Interlocked.CompareExchange(ref isLoaded, 1, 0) != 0) 
      return; 
     #pragma warning restore 420 
+10

अच्छा असीसी आर्टवर्क, लेकिन यह –

+3

प्रश्न का उत्तर नहीं देता है, लेकिन जब आप अन्य उत्तरों को समझ लेते हैं तो यह आसान हो जाता है, क्या आप इंटरलाक्ड और अस्थिर दोनों का उपयोग करने का निर्णय लेना चाहिए। – yoyo

+2

@ जेडरडिआस - नहीं, लेकिन यह आपको बताता है कि चेतावनी के बारे में क्या करना है। जो सुपर उपयोगी है। - कलाकृति भी मजाकिया था। – BrainSlugs83

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

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