नेट में 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
कीवर्ड पर केंद्रित है जो मैं इसका उपयोग समझता हूं।
जो के ट्यूटोरियल में (पेज पर मैं लिंक करता हूं) 'मेमोरी बाधाओं और लॉकिंग' की खोज में एक छोटा अनुच्छेद है जो बताता है कि वे बराबर हैं "अगर हम लॉक की पारस्परिक बहिष्करण गारंटी को अनदेखा करते हैं"। –
हालांकि पारस्परिक बहिष्कार को अनदेखा करने से तुलनात्मक प्रकार की व्यर्थता होती है क्योंकि यह ताले – Grizzly
@Grizzly का एक अभिन्न अंग है: तुलना व्यर्थ नहीं है - यह * बाड़ * के संदर्भ में उपयोगी है। लेकिन यह दो चीजों को "समान कार्य" कहने जैसा नहीं है - क्योंकि पारस्परिक बहिष्करण गारंटी लॉकिंग का मुख्य बिंदु है। –