2012-03-30 14 views
16

हाल ही में मैं एक वेबसाइट में इस कोड को देखा है, और मेरे सवाल यह है:multithreading जब एक एकल बूल चर लॉकिंग?

 private bool mbTestFinished = false; 

     private bool IsFinished() 
     { 
      lock(mLock) 
      { 
       return mbTestFinished; 
      } 
     } 

     internal void SetFinished() 
     { 
      lock(mLock) 
      { 
       mbTestFinished = true; 
      } 
     } 

एक multithread वातावरण में, mbTestFinished के लिए उपयोग लॉक करने के लिए वास्तव में जरूरी है?

+6

यह सुनिश्चित करने के लिए यह सबसे सिद्ध तंत्र है कि यह एक सीपीयू-कैश किए गए पढ़ने (जो धागे के बीच अच्छी तरह से काम नहीं करेगा) - 'अस्थिर' भी काम करेगा, लेकिन उन कारणों के लिए जो बहुत जटिल हैं (यह नहीं है * 'अस्थिर' का इरादा *, बल्कि: एक दुष्प्रभाव) –

+4

@MarcGravell मैंने हमेशा सोचा है कि _ वास_ 'अस्थिर' का इरादा है; कोई मौका है कि आप एक अच्छा लिंक छोड़ सकते हैं जो बताता है कि क्या है? –

+1

@romkyns: यह [उत्तर] (http://stackoverflow.com/a/4103879/158779) कुछ अंतर्दृष्टि प्रदान करता है। –

उत्तर

9

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

9

मेरी राय में, नहीं, ताला ज़रूरत से ज़्यादा यहाँ, है दो कारणों के लिए:

  1. बूलियन चर उदाहरण के लिए long तरह फाड़ असाइनमेंट कारण नहीं हो सकता, इसलिए ताला लगा आवश्यक नहीं है।
  2. दृश्यता समस्या को हल करने के लिए volatile पर्याप्त है। यह सच है कि lock एक अंतर्निहित बाड़ पेश करता है, लेकिन lock परमाणुता के लिए आवश्यक नहीं है, volatile पर्याप्त है।
+0

यह सच है कि लॉक का उपयोग कर * केवल * चीज़ दिखाया गया कोड है। यदि अन्य जगहें हैं जहां 'एमएलॉक' लिया जाता है, तो 'अस्थिर' में रूपांतरण चीजों को तोड़ सकता है। –

+0

@romkyns: हाँ, मुझे लगता है कि यह एक आत्मनिर्भर परिदृश्य है। – Tudor

4

तो mLock केवल चर mbTestFinished के लिए है, तो यह एक overkill का एक सा है। इसके बजाय, आप अस्थिर या इंटरलॉक का उपयोग कर सकते हैं, क्योंकि उपयोगकर्ता-मोड थ्रेड सिंक्रनाइज़ेशन के लिए बनाता है। ताला (या मॉनिटर) एक हाइब्रिड का निर्माण, इस अर्थ में कि यह अच्छी तरह से/कर्नेल-मोड जब भी संभव करने के लिए से गुजर से बचने के लिए अनुकूलित है है। "सीएलआर के माध्यम से सी #" पुस्तक में इन अवधारणाओं की गहन चर्चा है।

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