एमईएफ स्रोत कोड के माध्यम से ब्राउज़िंग मुझे यह टुकड़ा मिला। क्या कोई बता सकता है कि लॉक के अंदर MemoryBarrier
क्यों आवश्यक है?Thread.MemoryBarrier क्यों उपयोग किया जाता है?
पूरे विधि है:
public void SatisfyImportsOnce(ComposablePart part)
{
this.ThrowIfDisposed();
if (this._importEngine == null)
{
ImportEngine importEngine = new ImportEngine(this, this._compositionOptions);
lock(this._lock)
{
if (this._importEngine == null)
{
Thread.MemoryBarrier();
this._importEngine = importEngine;
importEngine = null;
}
}
if(importEngine != null)
{
importEngine.Dispose();
}
}
this._importEngine.SatisfyImportsOnce(part);
}
करने के लिए सौंपा importEngine ताजगी की गारंटी प्रदान करता है यह * लगता है * कि कभी कभी, ताला पर्याप्त –
नहीं है यह एक बहुत अधिक संदर्भ जानने के बिना इस सवाल का जवाब देना असंभव है। –
यह एक कमजोर मेमोरी मॉडल वाले प्रोसेसर पर एफयूडी है, कुछ माइक्रोसॉफ्ट प्रोग्रामर शायद इटेनियम को कम करने से कभी भी ठीक नहीं होंगे। यह सुनिश्चित करता है कि एक और थ्रेड पूरी तरह से निर्मित ऑब्जेक्ट का निरीक्षण कर सकता है जब यह _importEngine संदर्भ का उपयोग करता है। ऑब्जेक्ट फ़ील्ड लिखे जाने से पहले एक कमजोर प्रोसेसर पर संदर्भ स्मृति में लिखा जा सकता है, इसलिए एक और धागा अनियमित फ़ील्ड मान देख सकता है। .NET 2.0 के बाद से जरूरी नहीं है और निश्चित रूप से यहां जरूरी नहीं है क्योंकि लॉक पहले ही मेमोरी बाधा का तात्पर्य है। –