2012-06-23 16 views
14

इस article के अनुसार:एक std :: mutex को दो बार 'अनिर्धारित व्यवहार' लॉक क्यों कर रहा है?

आप कोशिश करते हैं और बीच में अनलॉक किए बिना एक ही धागे से दो बार एक गैर पुनरावर्ती म्युटेक्स ताला हैं, तो आप अपरिभाषित व्यवहार मिलता है।

मेरा बहुत ही मूर्ख मन मुझे बताता है कि वे सिर्फ एक त्रुटि क्यों नहीं लौटते? क्या ऐसा कोई कारण है कि यह यूबी क्यों होना चाहिए?

+0

आप डिफ़ॉल्ट स्मृति आदेश के साथ atomic_flag का उपयोग करना चाहते हो सकता है। इसमें डेटा रेस नहीं हैं और कई अनलॉक कॉल के साथ म्यूटेक्स जैसे अपवाद फेंकते हैं (और अनियंत्रित रूप से बंद हो जाते हैं, मैं जोड़ सकता हूं ...)। वैकल्पिक रूप से, परमाणु (उदा। परमाणु [बूल] या परमाणु [int] (त्रिभुज ब्रैकेट के साथ, नहीं []) है, जिसमें लोड और तुलना_exchange_strong जैसे अच्छे कार्य होते हैं। http://www.cplusplus.com/reference/atomic/atomic_flag/ http://www.cplusplus.com/reference/atomic/atomic/ – Andrew

+0

साथ ही 'mutex' को ओएस देशी म्यूटेक्स के साथ कार्यान्वित किया जा सकता है, फिर यह परिभाषित करने के लिए समझें कि अलग-अलग ओएस पर अलग-अलग क्या हो सकता है ताकि 'std :: mutex' ओयू के आस-पास एक पतली आवरण हो सकता है जो मुट्टेक्स प्रदान करता है। – Phil1970

उत्तर

26

क्योंकि यह कभी नहीं एक सही कार्यक्रम में होता है, और कुछ है कि कभी नहीं होता है के लिए एक जाँच कर रही है बेकार है (और है कि जाँच यह मालिक थ्रेड ID है, जो भी बेकार है संग्रहीत करना होता है बनाने के लिए)।

ध्यान दें कि यह अपरिभाषित जा रहा डिबग कार्यान्वयन, उदाहरण के लिए, एक अपवाद फेंकने के लिए, जबकि अभी भी अनुमति देता है रिहाई कार्यान्वयन संभव के रूप में कुशल होने के लिए अनुमति देता है।

+1

अच्छा एक है, लेकिन मुझे लगता है कि tbh अच्छा dbg कार्यान्वयन पर जोर देना चाहिए, कभी कभी ppl के बाद से: पी लिखने कोड है कि ज्यादा शोर कर के बिना अपवाद खाता है। : डी – NoSenseEtAl

15

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

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