2010-01-01 13 views
5

विंडोज म्यूटेक्स एक अधिग्रहण लॉक को फिर से हासिल करने की अनुमति देता है (रिकर्सिवली) अगर वर्तमान में लॉक के मालिक का अधिग्रहण करने का प्रयास करता है।विंडोज म्यूटेक्स के रिकर्सिव लॉकिंग व्यवहार को कैसे बदला जाए?

लेकिन, पॉज़िक्स आधारित पाथ्रेड ताले ऐसे व्यवहार की अनुमति नहीं देते हैं।

क्या कोई संकलन समय मैक्रो या कोई सेटिंग है जो विंडोज़ म्यूटेक्स को पथ्रेड म्यूटेक्स के समान व्यवहार कर सकती है?

उत्तर

6

में उन्हें लागू करने के रूप में लंबे समय के रूप में आप विंडोज में कार्यक्रम, इसकी Mutex के व्यवहार reimplementing से बचने पर गौर करना होगा। यह एक ही थ्रेड द्वारा पुन: प्रवेश किया जा रहा है अपने परिभाषित व्यवहार के लिए बिल्कुल जरूरी है।

थ्रेड एफ़िनिटी के बिना एक सिंक ऑब्जेक्ट एक सेमफोर है जो कि गणना करता है 1. CreateSemaphore() का उपयोग करें।

Fwiw, यह बहुत उत्सुक है कि आपको इस तरह के व्यवहार की आवश्यकता है। ऐसा लगता है कि आप एक ही सिंक ऑब्जेक्ट को कई स्थानों पर अनुपयुक्त रूप से उपयोग करने का प्रयास कर रहे हैं। आप सेमफोर का उपयोग कर सकते हैं लेकिन आप समवर्ती क्षमता खो देंगे। इसके बजाय एक से अधिक mutex का उपयोग करने पर विचार करें।

+0

दरअसल, मुझे यह समस्या विरासत कोड से संबंधित है और मैं इसे तर्क के बिना बिना हल करना चाहता हूं। तो, जानना चाहता था कि व्यवहार बदला जा सकता है या नहीं। मेरा कोड एकाधिक ओएस में काम करना चाहिए, इसलिए मैं चाहता हूं कि व्यवहार सभी ओएस में समान रहे। "ऐसा लगता है जैसे आप एक ही सिंक ऑब्जेक्ट को कई स्थानों पर अनुपयुक्त रूप से उपयोग करने का प्रयास कर रहे हैं।" - हाँ। यह नकारात्मक परिदृश्य का मामला है। मैं सिर्फ नकारात्मक परिदृश्य में सभी ओएस में व्यवहार समान होना चाहता हूं। आपके उत्तर के लिए धन्यवाद! – Jay

+1

ठीक है, एक बढ़ावा सेमफोर का उपयोग करें। बहु मंच और गैर-पुनर्वित्त। –

+0

+1 (अनुवर्ती टिप्पणी उत्तर के रूप में अच्छी है)। – WhozCraig

0

इस आलेख को 'fast mutex' के अंतर्गत देखें।

इस प्रकार के म्यूटेक्स को पुनः प्राप्त नहीं किया जा सकता है।

जरुर, आप कैसे सी

+0

फास्ट म्यूटेक्स समर्थन ड्राइवरों के लिए है, उपयोगकर्ता-मोड कोड नहीं। – gavinb

6

आप इस तथ्य को बदल नहीं सकते कि विंडोज म्यूटेक्स रिकर्सिव हैं। और जबकि पॉज़िक्स थ्रेड डिफ़ॉल्ट रूप से रिकर्सिव नहीं होते हैं, तो का उपयोग PTHREAD_MUTEX_RECURSIVE ध्वज के साथ करने के लिए कर सकते हैं।

विंडोज में एक म्यूटेक्स लॉक करना वास्तव में एक महंगा ऑपरेशन है, और इंटर-प्रोसेस सिंक्रनाइज़ेशन के लिए सबसे उपयुक्त है। एक म्यूटेक्स के लिए केवल एक ही प्रक्रिया में उपयोग किया जाता है, आमतौर पर एक महत्वपूर्ण अनुभाग का उपयोग किया जाता है, हालांकि ये फिर से प्रवेश कर रहे हैं। नोबगज़ राज्यों के रूप में, आपको गैर-पुनरावर्ती सिंक्रनाइज़ेशन प्राप्त करने के लिए 1 की अधिकतम गणना के साथ शुरू किया गया एक सेमफोर का उपयोग करना होगा।

एक सेमफोर ऑब्जेक्ट एक विशेष काउंटर की तरह है, जिसे परमाणु रूप से बढ़ाया जा सकता है और धागे (या प्रक्रियाओं को साझा किए जाने पर) में कम किया जा सकता है। अधिकतम 1 के साथ एक बनाकर, आपको आवश्यक गैर-पुनरावर्ती व्यवहार मिलता है।

+0

गंभीर खंड उसी धागे से फिर से दर्ज किया जा सकता है। http://msdn.microsoft.com/en-us/library/ms682608(VS.85).aspx – arke

+0

उस ओप्स को पकड़ने के लिए धन्यवाद - तदनुसार निश्चित उत्तर। – gavinb

2

मैं Read/Write locks (aka SRW) उपयोग करने के लिए सुझाव देते हैं। विंडोज म्यूटेक्स की तरह, वे रिकर्सिव नहीं हैं। गंभीर वर्गों की तरह, वे हल्के हैं और अगर वे स्वतंत्र हैं तो कर्नेल को कॉल न करें (Benchmarks)।

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