2010-08-14 12 views
8

मैं एक साधारण नेट कार्यक्रम है, जो करता है, तो एक और उदाहरण शुरू कर दिया गया है देखने के लिए जाँच करता है मिल गया है:विंडोज प्लेटफार्म पर .NET Mutex: मेरे काम के बाद उनके साथ क्या होता है?

Mutex mutex = new Mutex(false,"MyMutexName"); 
    if (!mutex.WaitOne(1)) 
     return; 

    try{ 
    //do stuff 
    } 
    catch{ //exceptions} 
    finally 
    { 
     mutex.ReleaseMutex(); 
    } 

मेरा प्रश्न है, वास्तव में क्या म्युटेक्स के लिए होता आप इसे जारी करने के लिए जब कार्यक्रम समाप्त होता है भूल जाते हैं ? क्या यह कुछ विंडोज़ नियंत्रण कक्ष घटक में दिखाई देता है? वो कहाँ रहता है?

+0

नाम mutexes सामान्य रूप से केवल पार प्रक्रिया संचार, जो नहीं है कि आपके उदाहरण कुछ भी नहीं दिखा रहा है के समन्वय के लिए उपयोग किया जाता है। –

+0

@Steven: इसके लिए mutexes का उपयोग करना वास्तव में एक अच्छा उपयोग है। पिछली विंडो या प्रक्रिया नाम या कुछ का पता लगाने की कोशिश करने से कहीं बेहतर है। 1) आपके आवेदन 2) कि म्युटेक्स साथ प्रक्रियाओं में सिंक्रनाइज़ किया जा रहा के पिछले उदाहरण के अस्तित्व का पता लगाने के एक नामित म्युटेक्स का उपयोग करना: – erikkallen

+0

मैं के रूप में आप अपने कोड में दो अर्द्ध संबंधित कार्य कर रहे होते मेरे सवाल का अद्यतन,। –

उत्तर

11

यह एक नामित म्युटेक्स तो यह दिखाई दे रहा है और अन्य प्रक्रियाओं में खोला जा सकता है। विंडोज हैंडल पर एक साधारण संदर्भ गणना का उपयोग करता है। यदि आप इसे स्पष्ट रूप से नहीं लेते हैं() यह स्पष्ट रूप से स्वयं है तो अंतिमकर्ता आपके लिए हैंडल बंद कर देगा। यदि आपका प्रोग्राम कड़ी मेहनत करता है और फाइनलर को कभी निष्पादित नहीं करता है तो विंडोज़ ऐसा करेगा जब यह आपके प्रोग्राम द्वारा उपयोग किए जाने वाले संसाधनों को साफ़ करता है।

कि स्वचालित रूप से संदर्भ गिनती घटती जाएगी। यदि यह शून्य पर गिना जाता है (किसी अन्य प्रक्रिया में कोई संभाल नहीं होता है) तो कर्नेल ऑब्जेक्ट जारी किया जाता है।

दूसरे शब्दों में: आप कोई बात नहीं कितनी बुरी तरह से चीजें बाहर बारी एक समस्या नहीं है। वास्तविक उत्परिवर्ती वस्तु कर्नेल मेमोरी पूल में रहता है। आप इसे SysInternals 'WinObj टूल के साथ देख सकते हैं।

+0

ठीक है, मैंने शुरुआत में ही हैंडल के बारे में यही कहा था। यहां जटिलता यह है कि, यदि कोई अन्य प्रक्रिया आपके नामित म्यूटेक्स को संभालती है, और फिर स्वामित्व प्राप्त करने के बाद आप थ्रेड बंद कर देते हैं, तो म्यूटेक्स को छोड़ दिया जाता है। अधिक जानकारी के लिए मेरा जवाब देखें। –

+0

इसके अलावा, Mutex.Dispose() इसे जारी नहीं करता है। रिलीजम्यूटेक्स() को स्पष्ट रूप से कॉल करने की आवश्यकता है, अन्यथा नए मालिक को छोड़ दिया जाएगा MutexException। –

2

म्यूटेक्स ओएस-स्तरीय हैंडल हैं। वे जब अपने प्रक्रिया करता है (यदि आप उन्हें जल्दी ही बंद नहीं करते, कि है।) बंद कर दिया प्राप्त करेंगे

संपादित

ठीक है, मैं स्पष्ट रूप से उदाहरण और सवाल गलत समझा। यदि आप यह पता लगाने की कोशिश कर रहे हैं कि कोई और उदाहरण मौजूद है, तो आप नामित म्यूटेक्स (या इसी तरह की ऑब्जेक्ट) बनायेंगे और बस इसके अस्तित्व को बिना लॉक किए बिना जांच लेंगे।

WaitOne पर कॉल, स्वामित्व लेते हुए, ReleaseMutex से छुटकारा पाता है (जब तक WaitOne पर कोई अतिरिक्त कॉल नहीं है)। यदि आप म्यूटेक्स को पूरी तरह से जारी किए बिना धागे को समाप्त करते हैं, तो यह वस्तु को खराब स्थिति में छोड़ देता है, जैसा कि पाठ मीका उद्धरण में बताया गया है।

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

अतिरिक्त

एसडीके [एपीआई] [1] स्तर पर, आप में नाकाम रहने के लिए जब एक ही नाम के एक म्युटेक्स पहले से ही बनाया गया है की उम्मीद के साथ CreateMutex कॉल कर सकते हैं। .NET में (ठीक है, 4.0 में, कम से कम), एक [कन्स्ट्रक्टर] [2] है जो createdNew बूल भरता है।

[1]: http://msdn.microsoft.com/en-us/library/ms682411(VS.85).aspx CreateMutex

[2]: http://msdn.microsoft.com/en-us/library/bwe34f1k(v=VS.90).aspx Mutex

2

MSDN

एक धागा समाप्त हो जाता है, जबकि एक म्युटेक्स मालिक हैं से, म्युटेक्स परित्यक्त होना कहा जाता है । म्यूटेक्स की स्थिति संकेतित करने के लिए सेट है और अगला प्रतीक्षा धागा स्वामित्व प्राप्त करता है। यदि कोई भी म्यूटेक्स का मालिक नहीं है, तो म्यूटेक्स की स्थिति संकेतित है। के संस्करण 2.0 में शुरूआत, .NET Framework, AbandonedMutexException में अगले थ्रेड को म्यूटेक्स प्राप्त करने वाले फेंक दिया गया है। .NET Framework के संस्करण 2.0 से पहले, कोई अपवाद फेंक दिया गया था।

सावधानी

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

सिस्टम-वाइड म्युटेक्स के मामले में, एक परित्यक्त म्युटेक्स का संकेत हो सकता है कि एक आवेदन अचानक समाप्त कर दिया गया है (उदाहरण के लिए, Windows कार्य प्रबंधक का उपयोग करके)।

+2

स्पष्टीकरण के लिए, एक म्यूटेक्स "सिस्टम-वाइड" क्या बनाता है यह है कि एक से अधिक प्रक्रियाओं के लिए इसका एक संभाल होता है। अन्यथा, जब प्रक्रिया बंद हो जाती है, तो यह इसके साथ म्यूटक्स लेता है। –

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