पॉज़िक्स म्यूटेक्स को रिकर्सिव करने की अनुमति देता है। इसका मतलब है कि वही थ्रेड एक ही म्यूटेक्स को दो बार लॉक कर सकता है और डेडलॉक नहीं करेगा। बेशक इसे इसे दो बार अनलॉक करने की भी आवश्यकता है, अन्यथा कोई अन्य थ्रेड म्यूटेक्स प्राप्त नहीं कर सकता है। पर्थ्रेड का समर्थन करने वाली सभी प्रणालियों में भी रिकर्सिव म्यूटेक्स का समर्थन नहीं होता है, लेकिन यदि वे POSIX conform, they have to बनना चाहते हैं।रिकर्सिव लॉक (म्यूटेक्स) बनाम गैर-रिकर्सिव लॉक (म्यूटेक्स)
अन्य एपीआई (अधिक उच्च स्तरीय एपीआई) आमतौर पर म्यूटेक्स की पेशकश करते हैं, जिन्हें अक्सर ताले कहा जाता है। कुछ सिस्टम/भाषाएं (जैसे कोको ऑब्जेक्टिव-सी) दोनों, रिकर्सिव और गैर रिकर्सिव म्यूटेक्स प्रदान करते हैं। कुछ भाषाएं केवल एक या दूसरी पेशकश करती हैं। जैसे जावा म्यूटेक्स में हमेशा रिकर्सिव होते हैं (एक ही थ्रेड एक ही ऑब्जेक्ट पर दो बार "सिंक्रनाइज़" हो सकता है)। उनके द्वारा प्रदान की जाने वाली अन्य थ्रेड कार्यक्षमता के आधार पर, रिकर्सिव म्यूटेक्स नहीं होने पर कोई समस्या नहीं हो सकती है, क्योंकि उन्हें आसानी से लिखा जा सकता है (मैंने पहले से ही अधिक सरल म्यूटेक्स/हालत संचालन के आधार पर रिकर्सिव म्यूटेक्स को लागू किया है)।
जो मैं वास्तव में समझ में नहीं आता: गैर-पुनरावर्ती म्यूटेक्स क्या अच्छे हैं? अगर मैं एक ही म्यूटेक्स को दो बार लॉक करता हूं तो मैं थ्रेड डेडलॉक क्यों लेना चाहता हूं? यहां तक कि उच्च स्तरीय भाषाएं जो इससे बच सकती हैं (उदाहरण के लिए परीक्षण करें कि यह डेडलॉक होगा और अपवाद फेंक देगा) आमतौर पर ऐसा नहीं करता है। वे इसके बजाय थ्रेड डेडलॉक देंगे।
क्या यह केवल मामलों के लिए है, जहां मैं गलती से इसे दो बार लॉक करता हूं और केवल एक बार इसे अनलॉक करता हूं और रिकर्सिव म्यूटेक्स के मामले में, समस्या को ढूंढना मुश्किल होगा, इसलिए इसके बजाय मुझे यह देखने के लिए तुरंत गलत है कि यह कहां गलत है लॉक प्रकट होता है? लेकिन अगर मैं अनलॉक करते समय लॉक काउंटर लौटाता हूं और एक स्थिति में, जहां मुझे यकीन है कि मैंने अंतिम लॉक जारी किया है और काउंटर शून्य नहीं है, तो मैं अपवाद फेंक सकता हूं या समस्या को लॉग कर सकता हूं? या क्या कोई अन्य, अधिक उपयोगी उपयोग-गैर-पुनरावर्ती म्यूटेक्स का मामला है जिसे मैं देखने में असफल रहा? या यह शायद सिर्फ प्रदर्शन है, क्योंकि एक गैर-पुनरावर्ती म्यूटेक्स एक रिकर्सिव से थोड़ा तेज हो सकता है? हालांकि, मैंने इसका परीक्षण किया और अंतर वास्तव में इतना बड़ा नहीं है।
गैर पुनरावर्ती म्युटेक्स के बारे में अपने स्पष्टीकरण अधिक एक सेमाफोर तरह लग रहा था। एक म्यूटेक्स (चाहे रिकर्सिव या गैर-रिकर्सिव) स्वामित्व की धारणा है। –
@JayD जब लोग इन तरह की चीजों के बारे में बहस करते हैं तो यह बहुत भ्रमित होता है .. तो इन चीजों को परिभाषित करने वाली इकाई कौन है? – Pacerier
@Pacerier प्रासंगिक मानक। यह उत्तर उदा। पॉज़िक्स (pthreads) के लिए गलत है, जहां थ्रेड के अलावा थ्रेड में सामान्य म्यूटेक्स को अनलॉक करना है, जो इसे लॉक करता है, अपरिभाषित व्यवहार है, जबकि एक त्रुटि जांच या रिकर्सिव mutex परिणामों के साथ ऐसा करने के लिए एक संभावित त्रुटि कोड में होता है। अन्य सिस्टम और मानक बहुत अलग व्यवहार कर सकते हैं। – nos