जवाबों:
lock
एक संकलक कीवर्ड है, एक वास्तविक वर्ग या वस्तु नहीं है। यह Monitor
कक्षा की कार्यक्षमता के चारों ओर एक आवरण है और इसे बनाने के लिए डिज़ाइन किया गया हैMonitor
सामान्य मामलों के साथ काम करने आसान ।
Monitor
(और lock
कीवर्ड), कर रहे हैं के रूप में डैरिन, कहा तक ही सीमित AppDomain
। मुख्य रूप से क्योंकि एक स्मृति पते (एक तात्कालिक वस्तु के रूप में) का संदर्भ "लॉक" का प्रबंधन करने और उसकी पहचान बनाए रखने के लिए आवश्यक हैMonitor
Mutex
दूसरी ओर, एक ऑपरेटिंग सिस्टम निर्माण के चारों ओर एक नेट आवरण है, और पूरे सिस्टम में तुल्यकालन के लिए इस्तेमाल किया जा सकता, स्ट्रिंग का उपयोग डेटा अपने पहचानकर्ता के रूप में (डेटा के लिए सूचक के बजाय)। दो म्यूटेक्स जो दो स्ट्रिंग्स को दो पूरी तरह से अलग-अलग मेमोरी एड्रेस में संदर्भित करते हैं, लेकिन एक ही डेटा होने पर वास्तव में एक ही ऑपरेटिंग-सिस्टम म्यूटेक्स का उपयोग करेंगे।
A या तो किसी प्रक्रिया या सिस्टम-वाइड के लिए स्थानीयMutex
हो सकता है । MSDN :
म्यूटेक्स दो प्रकार के होते हैं: स्थानीय म्यूटेक्स, जो अनाम हैं, और सिस्टम म्यूटेक्स नाम दिए गए हैं। एक स्थानीय म्यूटेक्स केवल आपकी प्रक्रिया के भीतर ही मौजूद है।
इसके अलावा, एक को विशेष ध्यान रखना चाहिए - एक ही पृष्ठ पर विस्तृत - साथ ही टर्मिनल सेवाओं के साथ एक सिस्टम-वाइड म्यूटेक्स का उपयोग करते समय।
के बीच के अंतरों में से एक है Mutex
और lock
यह कर्नेल-स्तर के निर्माणMutex
का उपयोग करता है , इसलिए सिंक्रोनाइज़ेशन को हमेशा कम से कम एक उपयोगकर्ता स्थान-क्लेश अंतरिक्ष संक्रमण की आवश्यकता होगी।
lock
- यह वास्तव में Monitor
कक्षा का एक शॉर्टकट है , दूसरी ओर कर्नेल संसाधनों को आवंटित करने से बचने और कर्नेल कोड में संक्रमण से बचने की कोशिश करता है (और इस तरह दुबला और तेज होता है - अगर किसी को एक WinAPI निर्माण ढूंढना है कि यह जैसा दिखता है, यह होगा CriticalSection
)।
अन्य अंतर वह है जो अन्य इंगित करते हैं: एक नाम Mutex
का उपयोग प्रक्रियाओं में किया जा सकता है।
जब तक किसी की विशेष आवश्यकता नहीं है या प्रक्रियाओं में सिंक्रनाइज़ेशन की आवश्यकता नहीं है, तब तक छड़ी lock
(उर्फ) से चिपके रहना बेहतर हैMonitor
) to
कई अन्य "मामूली" अंतर हैं, जैसे परित्याग को कैसे संभाला जाता है, आदि।
उसी के बारे में ReaderWriterLock
और ReaderWriterLockSlim
3.5 में कहा जा सकता है , Semaphore
और SemaphoreSlim
.NET 4.0 में नया आदि। यह सच है कि बाद की xxSlim
कक्षाओं को सिस्टम-वाइड सिंक प्राइमेटिव के रूप में इस्तेमाल नहीं किया जा सकता है, लेकिन वे कभी भी इसका मतलब नहीं थे - वे "केवल" मतलब थे तेजी से और अधिक संसाधन के अनुकूल होने के लिए।
मैं यह देखने के लिए एक म्यूटेक्स का उपयोग करता हूं कि क्या मेरे पास पहले से ही उसी मशीन पर चल रहे एप्लिकेशन की एक प्रति है।
bool firstInstance;
Mutex mutex = new Mutex(false, @"Local\DASHBOARD_MAIN_APPLICATION", out firstInstance);
if (!firstInstance)
{
//another copy of this application running
}
else
{
//run main application loop here.
}
// Refer to the mutex down here so garbage collection doesn't chuck it out.
GC.KeepAlive(mutex);
पहले से ही बहुत कुछ कहा गया है, लेकिन इसे सरल बनाने के लिए, यहाँ मेरा लेना है।
ताला -> सरल उपयोग करने के लिए, मॉनिटर पर आवरण, एक AppDomain में धागे के पार ताले।
अनाम म्यूटेक्स -> लॉकिंग स्कोप को छोड़कर लॉक के समान है और यह एक प्रक्रिया में AppDomain के पार है।
नामित म्यूटेक्स -> लॉकिंग स्कोप अनाम म्यूटेक्स से अधिक है और यह एक ऑपरेटिंग सिस्टम में प्रक्रिया के दौरान है।
तो अब विकल्प हैं, आपको अपने मामले में सबसे उपयुक्त एक का चयन करने की आवश्यकता है।
म्यूटेक्स एक क्रॉस प्रक्रिया है और आवेदन के एक से अधिक उदाहरण नहीं चलने का एक क्लासिक उदाहरण होगा।
दूसरा उदाहरण यह है कि आप एक फाइल कर रहे हैं और आप एक ही फाइल को एक्सेस करने के लिए अलग-अलग प्रक्रिया नहीं चाहते हैं, आप एक म्यूटेक्स को लागू कर सकते हैं लेकिन एक बात याद रखें कि म्यूटेक्स एक ऑपरेटिंग सिस्टम चौड़ा है और दो रिमोट प्रोसेस के बीच उपयोग नहीं किया जा सकता है।
लॉक आपके कोड के सेक्शन को सुरक्षित रखने का एक सरल तरीका है और यह विशिष्ट है, यदि आप अधिक नियंत्रित सिंक्रोनाइज़ेशन चाहते हैं, तो आप Moniters के साथ लॉक को बदल सकते हैं।
कुछ अधिक छोटे अंतर जो उत्तर में उल्लिखित नहीं थे:
ताले का उपयोग कर के मामले में, आपको लगता है कि ताला हो जाएगा यकीन है कि हो सकता है जारी किया गया ताला के ब्लॉक के अंदर एक अपवाद तब होता है जब।
ऐसा इसलिए है क्योंकि लॉक हूड के तहत मॉनिटर का उपयोग करता है और इसे इस तरह से लागू किया जाता है:
object __lockObj = x;
bool __lockWasTaken = false;
try
{
System.Threading.Monitor.Enter(__lockObj, ref __lockWasTaken);
// Your code...
}
finally
{
if (__lockWasTaken) System.Threading.Monitor.Exit(__lockObj);
}
इस प्रकार, किसी भी मामले में, लॉक जारी किया जाता है, और आपको इसे मैन्युअल रूप से जारी करने की आवश्यकता नहीं है (जैसे आप म्यूटेक्स के लिए करेंगे)।
ताले के लिए, आप आमतौर पर लॉक करने के लिए एक निजी वस्तु का उपयोग करते हैं (और उपयोग करना चाहिए )।
यह कई कारणों से किया जाता है। (अधिक जानकारी: इस उत्तर और आधिकारिक दस्तावेज देखें )।
तो, तालों के मामले में, आप (गलती से) बाहर से बंद वस्तु तक नहीं पहुंच सकते हैं और कुछ नुकसान पहुंचा सकते हैं।
लेकिन म्यूटेक्स के मामले में, आप कर सकते हैं, क्योंकि यह एक म्यूटेक्स है जो सार्वजनिक रूप से चिह्नित है और कहीं से भी उपयोग किया जाता है।