मैंने हाल ही में मेमोरी बाधाओं और रीडरिंग मुद्दे के बारे में पढ़ा है और अब मुझे इसके बारे में कुछ भ्रम है।लॉक स्टेटमेंट द्वारा मेमोरी बैरियर
इस परिदृश्य पर विचार करें:
private object _object1 = null;
private object _object2 = null;
private bool _usingObject1 = false;
private object MyObject
{
get
{
if (_usingObject1)
{
return _object1;
}
else
{
return _object2;
}
}
set
{
if (_usingObject1)
{
_object1 = value;
}
else
{
_object2 = value;
}
}
}
private void Update()
{
_usingMethod1 = true;
SomeProperty = FooMethod();
//..
_usingMethod1 = false;
}
Update
विधि पर;_usingMethod1 = true
कथन हमेशा संपत्ति प्राप्त करने या स्थापित करने से पहले निष्पादित किया गया है? या पुनर्निर्देशन के मुद्दे के कारण हम इसकी गारंटी नहीं दे सकते?हम जैसे
private volatile bool _usingMethod1 = false;
volatile
का उपयोग करते हैं हमlock;
का उपयोग करना चाहिए हम तो गारंटी ले सकते हैं ताला भीतर हर बयान की तरह क्रम में निष्पादित किया जाएगा:private void FooMethod() { object locker = new object(); lock (locker) { x = 1; y = a; i++; } }
जानकारी के लिए धन्यवाद, यह वास्तव में मुझे अवधारणा को और समझने में मदद करता है .. मुझे यह सुनिश्चित करने के लिए क्या करना है कि "_usingMethod1 = true" निर्देश अगले निर्देश से पहले किया जाएगा कुछप्रॉपर्टी = FooMethod(); मल्टीथ्रेड सेनारियो में इसे कैसे लागू किया जाए? द्वारा: _usingMethod1 = सत्य; Thread.MemoryBarrier(); कुछ प्रॉपर्टी = FooMethod(); या पूर्ण बाड़ के लिए लॉक करें ताकि कोई पुन: व्यवस्थित न हो: लॉक (लॉकर) {_usingMethod1 = true; } कुछ प्रॉपर्टी = FooMethod(); या शायद _usingMethod1 को एक अस्थिर चर बनाकर। आपकी सहायता के लिए धन्यवाद. –
मैं अद्यतन विधि की संपूर्ण सामग्री को लॉक में लपेटूंगा। मेमोरी बाधाओं के अतिरिक्त यह ग्रेनटेस परमाणुता भी है, जो समान रूप से महत्वपूर्ण है। इसके अलावा, इन लॉक-फ्री मुहावरे (अस्थिर, थ्रेड। मेमरीबैरियर, आदि के माध्यम से) सही होने के लिए अविश्वसनीय रूप से कठिन हैं। –