2010-05-11 10 views
12

म्यूटेक्स और गंभीर खंड के बीच अंतर के बारे में एक मौजूदा प्रश्न है लेकिन यह ताले से भी निपटता नहीं है।ताले, म्यूटेक्स और गंभीर वर्गों के बीच अंतर

तो मैं जानना चाहता हूं कि प्रक्रियाओं के बीच थ्रेड सिंक्रनाइज़ेशन के लिए गंभीर वर्गों का उपयोग किया जा सकता है या नहीं।

इसके अलावा क्या संकेत राज्यों और गैर संकेत राज्यों

+2

वे मेरे लिए एक ही बात हैं, मेरा अनुमान है कि आप एक पुस्तकालय का उपयोग कर रहे हैं जो तीन (Win32?) के बीच कुछ अंतर बनाता है। –

+0

क्या आप कह रहे हैं कि CSingleLock जैसे ताले थ्रेड सिंक्रनाइज़ेशन का भी समर्थन करते हैं जब प्रक्रियाओं में धागे की बात आती है। मैंने सोचा कि केवल म्यूटेक्स ही इसका समर्थन करता है। अगर मैं गलत हूं तो कृपया मुझे सही करें – ckv

उत्तर

7

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

+0

"महत्वपूर्ण अनुभाग उपयोगकर्ता मोड में पूरी तरह लागू किए गए हैं" <- पूरी तरह से सच नहीं है। यदि वे पर्याप्त समय के लिए स्पिन करते हैं तो गंभीर वर्ग कताई के बजाय उपज करेंगे। –

2

CriticalSections मतलब है प्रक्रिया में हैं। नामित म्यूटेक्स का उपयोग प्रक्रियाओं में किया जा सकता है

लॉक एक सामान्य शब्द है और इस तरह मैं नहीं जानता कि आपका कौन सा प्लेटफॉर्म है। उदाहरण के लिए सी # में लॉक आदिम एक महत्वपूर्ण खंड है।

+0

और ताले भी प्रक्रिया में हैं? – ckv

2

1) गंभीर अनुभाग उपयोगकर्ता और इंटरलाक्ड-ऑपरेशंस के बीच पुल है। यह थ्रेड को लॉक और अनलॉक करने के लिए इनट्रलॉक-एक्सचेंज किए गए ऑपरेशंस का उपयोग करता है। यह mutexes से तेजी से काम करता है।

2) म्यूटेक्स एक कर्नल ऑब्जेक्ट है। यह तेजी से काम नहीं करता है लेकिन कुछ फायदे हैं। सबसे पहले, म्यूटेक्स नामक प्रक्रियाओं में इस्तेमाल किया जा सकता है। दूसरा, अगर थ्रेड समाप्त हो जाता है तो इस थ्रेड द्वारा लॉक किए गए म्यूटेक्स को अनलॉक किया जाता है।

3

गंभीर अनुभाग कर्नेल ऑब्जेक्ट्स नहीं हैं। वे किसी भी हैंडल के साथ पहचाने नहीं जाते हैं। उनका उपयोग केवल उसी प्रक्रिया से संबंधित धागे को सिंक्रनाइज़ करने के लिए किया जा सकता है। इन प्रक्रियाओं में सिंक्रनाइज़ेशन के लिए उनका उपयोग नहीं किया जा सकता है।

CSingleLock (मुझे लगता है कि आप इसे लॉक के रूप में संदर्भित कर रहे हैं, इस संदर्भ में) RAII अवधारणा का उपयोग करके एक रैपर वर्ग है। यह आपको थ्रेड सिंक्रनाइज़ेशन ऑब्जेक्ट (इसके कन्स्ट्रक्टर में) प्राप्त करने में मदद करता है और लॉक और अनलॉक एपीआई को एक आसान तरीके से कॉल करता है। (सभी आंतरिक विवरण छुपाएं जिनके सिंक्रनाइज़ेशन ऑब्जेक्ट्स का उपयोग कर रहा है)।

क्रिटिकल अनुभागों के साथ उपयोग किए जाने पर CSingleLock, प्रक्रिया में उपयोग नहीं किया जा सकता है। जहां इस उद्देश्य के लिए म्यूटेक्स का उपयोग किया जा सकता है।

जब कोई धागा म्यूटेक्स प्राप्त करता है और कोई अन्य थ्रेड म्यूटेक्स प्राप्त नहीं कर सकता है तो म्यूटेक्स की स्थिति गैर-सिग्नल स्थिति में कहा जाता है। यदि म्यूटेक्स उपलब्ध है और कोई धागे हासिल नहीं हुआ है तो यह सिग्नल राज्य में है।

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