2010-01-05 5 views
12

नेट में lock कीवर्ड, Monitor.Enter और Monitor.Exit आसपास वाक्यात्मक चीनी है, तो आप कह सकते हैं कि इस कोडजब .NET में बनाम MemoryBarrier लॉक का उपयोग करने के लिए

lock(locker) 
{ 
    // Do something 
} 

Monitor.Enter(locker); 
try 
{ 
    // Do Something 
} 
finally 
{ 
    Monitor.Exit(locker); 
} 
रूप में ही है

हालांकि .NET ढांचे में MemoryBarrier वर्ग भी शामिल है जो इसी प्रकार काम करता है

Thread.MemoryBarrier(); 
//Do something 
Thread.MemoryBarrier(); 

मैं उलझन में हूं क्योंकि /Monitor संस्करण पर मैं Thread.MemoryBarrier का उपयोग करना चाहता हूं? मुझे a Threading Tutorial द्वारा और भी भ्रमित कर दिया गया है, जिसमें कहा गया है कि वे समान रूप से कार्य करते हैं।

जहां तक ​​मैं देख सकता हूं कि दृश्य अंतर को लॉकिंग ऑब्जेक्ट की आवश्यकता नहीं है, जो मुझे लगता है कि Monitor का उपयोग करके आप थ्रेड में कुछ कर सकते हैं जहां MemoryBarrier एक ही थ्रेड पर है।

मेरा आंत मुझे बता रहा है कि एक और महत्वपूर्ण अंतर MemoryBarrier केवल चर के लिए है और विधियों के लिए नहीं है।

आखिरकार यह मौजूदा प्रश्न When to use ‘volatile’ or ‘Thread.MemoryBarrier()’ in threadsafe locking code? (C#) से संबंधित नहीं है, क्योंकि यह volatile कीवर्ड पर केंद्रित है जो मैं इसका उपयोग समझता हूं।

उत्तर

22

मेरे विचार में आपको लगभग कभीThread.MemoryBarrier का उपयोग करना चाहिए। इसका उपयोग लॉक-फ्री कोड के लिए किया जाता है - यह सुनिश्चित करना कि एक थ्रेड पर किए गए परिवर्तन किसी लॉक की लागत के बिना दूसरे पर दिखाई दे। यह नियंत्रण धागा सिंक्रनाइज़ेशन है, lock के विपरीत। मुझे नहीं लगता कि जो के ट्यूटोरियल में वह कहता है कि MemoryBarrier "उसी कार्य करता है" lock के रूप में। क्या आप समझा सकते हैं कि आप वास्तव में उस छाप को कहां से प्राप्त कर रहे हैं?

मेरे विचार में, निम्न स्तर के लॉक-फ्री कोड उन डेवलपर्स के अलावा लगभग किसी के लिए बहुत मुश्किल है जिनकी मुख्य दक्षता समरूपता है। अगर मैं कुछ लॉक-फ्री कोड लिखना चाहता हूं, तो मैं उच्च स्तर के बिल्डिंग ब्लॉक का निर्माण उन डेवलपर्स (जैसे .NET 4.0 में समांतर एक्सटेंशन) के बजाय बनाया था।

बस एक उदाहरण के रूप में, मैं हाल ही में मेरी आँखों volatile का सटीक अर्थ नहीं है जो करने के लिए खोला था "हमेशा मुख्य स्मृति से पढ़ा है, हमेशा मुख्य स्मृति पर लिखते"। (मेरे स्वयं के थ्रेडिंग ट्यूटोरियल में अभी भी उस स्पष्टीकरण है - मुझे कुछ बिंदु पर ठीक करने की ज़रूरत है।) It's far more subtle than that। इसका मतलब यह है कि के पिछले के पिछले उपयोगों में से कुछ गलत हो सकते हैं।

+0

जो के ट्यूटोरियल में (पेज पर मैं लिंक करता हूं) 'मेमोरी बाधाओं और लॉकिंग' की खोज में एक छोटा अनुच्छेद है जो बताता है कि वे बराबर हैं "अगर हम लॉक की पारस्परिक बहिष्करण गारंटी को अनदेखा करते हैं"। –

+1

हालांकि पारस्परिक बहिष्कार को अनदेखा करने से तुलनात्मक प्रकार की व्यर्थता होती है क्योंकि यह ताले – Grizzly

+1

@Grizzly का एक अभिन्न अंग है: तुलना व्यर्थ नहीं है - यह * बाड़ * के संदर्भ में उपयोगी है। लेकिन यह दो चीजों को "समान कार्य" कहने जैसा नहीं है - क्योंकि पारस्परिक बहिष्करण गारंटी लॉकिंग का मुख्य बिंदु है। –

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