लॉक और म्यूटेक्स में क्या अंतर है?


129

लॉक और म्यूटेक्स में क्या अंतर है? वे परस्पर विनिमय क्यों नहीं किया जा सकता है?

जवाबों:



95

lockएक संकलक कीवर्ड है, एक वास्तविक वर्ग या वस्तु नहीं है। यह Monitorकक्षा की कार्यक्षमता के चारों ओर एक आवरण है और इसे बनाने के लिए डिज़ाइन किया गया हैMonitor सामान्य मामलों के साथ काम करने आसान ।

Monitor(और lockकीवर्ड), कर रहे हैं के रूप में डैरिन, कहा तक ही सीमित AppDomain। मुख्य रूप से क्योंकि एक स्मृति पते (एक तात्कालिक वस्तु के रूप में) का संदर्भ "लॉक" का प्रबंधन करने और उसकी पहचान बनाए रखने के लिए आवश्यक हैMonitor

Mutexदूसरी ओर, एक ऑपरेटिंग सिस्टम निर्माण के चारों ओर एक नेट आवरण है, और पूरे सिस्टम में तुल्यकालन के लिए इस्तेमाल किया जा सकता, स्ट्रिंग का उपयोग डेटा अपने पहचानकर्ता के रूप में (डेटा के लिए सूचक के बजाय)। दो म्यूटेक्स जो दो स्ट्रिंग्स को दो पूरी तरह से अलग-अलग मेमोरी एड्रेस में संदर्भित करते हैं, लेकिन एक ही डेटा होने पर वास्तव में एक ही ऑपरेटिंग-सिस्टम म्यूटेक्स का उपयोग करेंगे।


54

A या तो किसी प्रक्रिया या सिस्टम-वाइड के लिए स्थानीयMutex हो सकता है । MSDN :

म्यूटेक्स दो प्रकार के होते हैं: स्थानीय म्यूटेक्स, जो अनाम हैं, और सिस्टम म्यूटेक्स नाम दिए गए हैं। एक स्थानीय म्यूटेक्स केवल आपकी प्रक्रिया के भीतर ही मौजूद है।

इसके अलावा, एक को विशेष ध्यान रखना चाहिए - एक ही पृष्ठ पर विस्तृत - साथ ही टर्मिनल सेवाओं के साथ एक सिस्टम-वाइड म्यूटेक्स का उपयोग करते समय।

के बीच के अंतरों में से एक है Mutexऔर lockयह कर्नेल-स्तर के निर्माणMutex का उपयोग करता है , इसलिए सिंक्रोनाइज़ेशन को हमेशा कम से कम एक उपयोगकर्ता स्थान-क्लेश अंतरिक्ष संक्रमण की आवश्यकता होगी।

lock- यह वास्तव में Monitorकक्षा का एक शॉर्टकट है , दूसरी ओर कर्नेल संसाधनों को आवंटित करने से बचने और कर्नेल कोड में संक्रमण से बचने की कोशिश करता है (और इस तरह दुबला और तेज होता है - अगर किसी को एक WinAPI निर्माण ढूंढना है कि यह जैसा दिखता है, यह होगा CriticalSection)।

अन्य अंतर वह है जो अन्य इंगित करते हैं: एक नाम Mutex का उपयोग प्रक्रियाओं में किया जा सकता है।

जब तक किसी की विशेष आवश्यकता नहीं है या प्रक्रियाओं में सिंक्रनाइज़ेशन की आवश्यकता नहीं है, तब तक छड़ी lock(उर्फ) से चिपके रहना बेहतर हैMonitor ) to

कई अन्य "मामूली" अंतर हैं, जैसे परित्याग को कैसे संभाला जाता है, आदि।

उसी के बारे में ReaderWriterLockऔर ReaderWriterLockSlim3.5 में कहा जा सकता है , Semaphoreऔर SemaphoreSlim.NET 4.0 में नया आदि। यह सच है कि बाद की xxSlimकक्षाओं को सिस्टम-वाइड सिंक प्राइमेटिव के रूप में इस्तेमाल नहीं किया जा सकता है, लेकिन वे कभी भी इसका मतलब नहीं थे - वे "केवल" मतलब थे तेजी से और अधिक संसाधन के अनुकूल होने के लिए।


25

मैं यह देखने के लिए एक म्यूटेक्स का उपयोग करता हूं कि क्या मेरे पास पहले से ही उसी मशीन पर चल रहे एप्लिकेशन की एक प्रति है।

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);

8

पहले से ही बहुत कुछ कहा गया है, लेकिन इसे सरल बनाने के लिए, यहाँ मेरा लेना है।

ताला -> सरल उपयोग करने के लिए, मॉनिटर पर आवरण, एक AppDomain में धागे के पार ताले।

अनाम म्यूटेक्स -> लॉकिंग स्कोप को छोड़कर लॉक के समान है और यह एक प्रक्रिया में AppDomain के पार है।

नामित म्यूटेक्स -> लॉकिंग स्कोप अनाम म्यूटेक्स से अधिक है और यह एक ऑपरेटिंग सिस्टम में प्रक्रिया के दौरान है।

तो अब विकल्प हैं, आपको अपने मामले में सबसे उपयुक्त एक का चयन करने की आवश्यकता है।


जैसा कि मैंने उत्तर से समझा है और म्यूटेक्स के लिए उदाहरण यहाँ हैं msdn.microsoft.com/en-us/library/… : एक अनाम म्यूटेक्स लॉक के समान कार्य करता है। हालाँकि mutex.WaitOne (1000) हमें लॉक को टाइमआउट करने का मौका देता है। दूसरी ओर, Monitor.TryEnter भी हमें वह क्षमता देता है। जैसा कि उल्लेख किया गया है, म्यूटेक्स एक आवरण है। इसलिए मैं एक अनाम म्यूटेक्स के बजाय एक लॉक या मॉनिटर का उपयोग करूंगा। लेकिन अगर प्रक्रियाओं पर ताला लगना जरूरी है, तो एक नामित म्यूटेक्स जाने का रास्ता है। अगर मैं गलत हूं कृपया मुझे सही।
कोरे

6

म्यूटेक्स एक क्रॉस प्रक्रिया है और आवेदन के एक से अधिक उदाहरण नहीं चलने का एक क्लासिक उदाहरण होगा।

दूसरा उदाहरण यह है कि आप एक फाइल कर रहे हैं और आप एक ही फाइल को एक्सेस करने के लिए अलग-अलग प्रक्रिया नहीं चाहते हैं, आप एक म्यूटेक्स को लागू कर सकते हैं लेकिन एक बात याद रखें कि म्यूटेक्स एक ऑपरेटिंग सिस्टम चौड़ा है और दो रिमोट प्रोसेस के बीच उपयोग नहीं किया जा सकता है।

लॉक आपके कोड के सेक्शन को सुरक्षित रखने का एक सरल तरीका है और यह विशिष्ट है, यदि आप अधिक नियंत्रित सिंक्रोनाइज़ेशन चाहते हैं, तो आप Moniters के साथ लॉक को बदल सकते हैं।


1

कुछ अधिक छोटे अंतर जो उत्तर में उल्लिखित नहीं थे:

  1. ताले का उपयोग कर के मामले में, आपको लगता है कि ताला हो जाएगा यकीन है कि हो सकता है जारी किया गया ताला के ब्लॉक के अंदर एक अपवाद तब होता है जब।
    ऐसा इसलिए है क्योंकि लॉक हूड के तहत मॉनिटर का उपयोग करता है और इसे इस तरह से लागू किया जाता है:

     object __lockObj = x;
     bool __lockWasTaken = false;
     try
     {
         System.Threading.Monitor.Enter(__lockObj, ref __lockWasTaken);
         // Your code...
     }
     finally
     {
         if (__lockWasTaken) System.Threading.Monitor.Exit(__lockObj);
     }

    इस प्रकार, किसी भी मामले में, लॉक जारी किया जाता है, और आपको इसे मैन्युअल रूप से जारी करने की आवश्यकता नहीं है (जैसे आप म्यूटेक्स के लिए करेंगे)।

  2. ताले के लिए, आप आमतौर पर लॉक करने के लिए एक निजी वस्तु का उपयोग करते हैं (और उपयोग करना चाहिए )।
    यह कई कारणों से किया जाता है। (अधिक जानकारी: इस उत्तर और आधिकारिक दस्तावेज देखें )।

तो, तालों के मामले में, आप (गलती से) बाहर से बंद वस्तु तक नहीं पहुंच सकते हैं और कुछ नुकसान पहुंचा सकते हैं।
लेकिन म्यूटेक्स के मामले में, आप कर सकते हैं, क्योंकि यह एक म्यूटेक्स है जो सार्वजनिक रूप से चिह्नित है और कहीं से भी उपयोग किया जाता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.