2011-12-18 13 views
5

सी ++ 11 मानक परिभाषित करता है unique_lock::unlock के रूप में (§ 30.4.2.2.2, पी 1159।)अद्वितीय_lock :: C++ 11 मानक में underspecified अनलॉक है?

void unlock(); 
Effects: pm->unlock() 
Postcondition: owns == false 
Throws: system_error when an exception is required (30.2.2). 
Error conditions: 
    — operation_not_permitted — if on entry owns is false. 

अन्य सभी ताला लगा संचालन निर्दिष्ट करते हैं कि एक अपवाद कम से कम दो अवसरों पर फेंक दिया जाता है:

  • म्युटेक्स NULL (system_errorerrc::operation_not_permitted साथ फेंकता)
  • म्युटेक्स पहले से ही बंद कर दिया है (system_errorerrc::operation_not_permitted साथ फेंकता)
है

अमान्य म्यूटेक्स के साथ समस्या unlock के लिए भी स्पष्ट रूप से संभव है, हालांकि मानक केवल लॉकिंग समस्याओं के लिए प्रोग्राम के व्यवहार को निर्दिष्ट करता है। क्या यह मानक में वास्तविक त्रुटि है या क्या मुझे कुछ याद आ रहा है?

+0

मुझे यकीन नहीं है कि मैं अनुसरण करता हूं। म्यूटेक्स अमान्य होने पर 'अनलॉक' कहने के लिए यह "स्पष्ट रूप से संभव" क्यों है? आप अनुमान लगा सकते हैं कि 'अनलॉक() 'के प्रभाव के रूप में' pm-> अनलॉक() 'है, अपरिभाषित व्यवहार' pm 'से बचने के लिए शून्य नहीं होना चाहिए और' BasicLockable' 'pm' के लिए अनुबंध पूरा होना चाहिए , इसलिए ताला वर्तमान निष्पादन एजेंट के स्वामित्व में होना चाहिए। क्या कुछ सूक्ष्मता है जो मुझे याद आ रही है? –

उत्तर

7

हालांकि स्पष्ट रूप से कहा, unique_lock निम्नलिखित अपरिवर्तनशीलताओं है:

if pm == nullptr then owns == false 
if owns == true then pm != nullptr 

पाने के लिए अभी कोई तरीका नहीं है unique_lock एक ऐसे राज्य में जो अपरिभाषित व्यवहार को छोड़कर इन इनवर्सेंट का उल्लंघन करता है। तो खंड:

— operation_not_permitted — if on entry owns is false. 

कि pm == nullptr मामले शामिल हैं।

ध्यान दें कि ~unique_lock() केवल pm->unlock() पर कॉल करता है यदि owns सत्य है। यदि owns सत्य है, तो pm != nullptr और इस प्रकार unlock() फेंक नहीं सकता है।

0

pmmutex_type और std::mutex में अनलॉक करने के लिए परिभाषा है:

void unlock() noexcept; 

है, unlock समारोह किसी भी अपवाद फेंक नहीं कर सकते, इसलिए unique_lock::unlock उन अपवादों में से किसी के वारिस की जरूरत नहीं है। क्यों यह किसी भी अपवाद को फेंक सकता है एक रहस्य है।

यह बहुत परेशान है कि unique_lock के लिए विनाशक अपवाद फेंक सकता है (क्योंकि मुझे लगता है कि इसे unlock पर कॉल करना पड़ सकता है)। यह मेरे लिए बुरा लगता है, क्योंकि अपवाद हैंडलिंग के दौरान ठीक से अनलॉक करने के लिए लॉक ऑब्जेक्ट का उपयोग करना एक बहुत ही सामान्य मुहावरे है। यह वास्तव में बुरा है कि ताला खोलने के दौरान लॉक अपवाद फेंक सकता है - खासकर जब अंतर्निहित म्यूटेक्स की अनुमति नहीं है।

कुछ निश्चित रूप से यहां गलत है।

मैं अभी भी अंतिम सार्वजनिक मसौदे से काम कर रहा हूँ, शायद यह तय किया गया था

+0

मैं वास्तविक सी ++ 11 मानक देख रहा हूं। न तो 'unique_ptr :: ~ unique_ptr' 'अस्वीकरण' है, न ही विनाशकों के लिए निहित रूप से जोड़ने का प्रस्ताव लागू किया गया है, इसलिए इसे ठीक नहीं किया गया है।हालांकि, मुझे लगता है कि यह एक अलग समस्या है। मानक निर्दिष्ट नहीं करता है कि मामले में क्या होता है, जब 'unique_ptr' में कोई कनेक्ट mutex नहीं है और उस लॉक पर 'अनलॉक' कहा जाता है। –

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