2014-08-27 7 views
13

के रूप में चिह्नित किया जा सकता है मेरे पास कस्टम दस्तावेज़ का प्रतिनिधित्व करने वाले थ्रेड-सुरक्षित Document वर्ग है। इसमें इसके राज्य को संशोधित करने के लिए गेटर्स (कॉन्स फ़ंक्शंस) और सेटर्स हैं। इन सभी कार्यों के म्युटेक्स-सुरक्षित दस्तावेज़ की गारंटी करने के बदला नहीं जाएगा, जब तक विधि पूरी तरह से निष्पादित किया जाएगा रहे हैं।म्यूटेक्स-लॉकिंग फ़ंक्शन को

लेकिन कारण QMutex उपयोग, मैं mutable उपयोग के बिना const के रूप में राज्य के पहुँचा समारोह चिह्नित नहीं कर सकते। कैप्चरिंग QMutex इसे बदलना राज्य है।

क्या यह कोड सही है, या इसे एक और अच्छे तरीके से लिखा जा सकता है? हैकी mutable उपयोग के बिना।

class Document 
{ 
    // This method should be const: it changes only mutex 
    // and don't touch document state 
    bool IsCorrect() const; 
    ... 
    mutable QMutex m_lock; 
}; 

bool Document::IsCorrect() const 
{ 
    // Capturing mutex object change it! 
    QMutexLocker lock(&m_lock); 
    ... Const-aware code 
    bool result = (m_context != NULL); 
    ... 
    return result; 
} 
+9

'म्यूटेबल' का यह उपयोग "हैकी" नहीं है ... यह वही है जो 'उत्परिवर्तनीय' है (लेकिन विशेष रूप से नहीं - उदाहरण के लिए कैशिंग परिणाम, उपकरण समान रूप से वैध उपयोग हैं)। –

+0

'mutable' एक कैश (बाहरी राज्य के आंतरिक प्रतिनिधित्व) कि ताजा जब पढ़ा, एक पढ़ने समारोह स्थिरांक है तो भले ही, कैश बदल सकते हैं हो सकता है हो सकता है, लेकिन इसका मतलब यह नहीं है का एक और उदाहरण है कि राज्य वस्तु बदल गई है। – stefaanv

+0

@TonyD मेरे मुख्य कहते हैं की तरह कुछ "स्थिरांक समारोह कुछ भी बदल रहा है नहीं होना चाहिए - और म्युटेक्स दस्तावेज़ राज्य का एक हिस्सा है, यह परोक्ष बदलते भ्रामक है"। क्या मुझे उसे तार्किक और बिटवाइज स्थिरता के बारे में समझाया जाना चाहिए? – eraxillan

उत्तर

18

हर्ब Sutter एक उत्कृष्ट talk on Channel9 इस विषय के बारे में है।

यहां प्रासंगिक बिंदु यह है कि सी ++ 11, mutable में थ्रेड सुरक्षा के संबंध में एक नया अर्थ प्राप्त हुआ है: "यह डेटा सदस्य आंतरिक रूप से सिंक्रनाइज़ किया गया है।" यह ठीक है कि एक म्यूटेक्स क्या है। एक म्यूटेक्स के बारे में बात करते समय हर्ब भी उस बात में कहता है: "यह उत्परिवर्तनीय होना चाहता है।"

तो एक mutable म्युटेक्स होने और एक const सदस्य समारोह से उस तक पहुंचने में बिल्कुल hacky नहीं है, और यह mutable के लिए प्राथमिक इरादा उपयोग करता है में से एक वास्तव में है।

+0

ठीक है, मैं हूँ अब शांत। हालांकि, मैं खोजने के म्युटेक्स आधारित डिजाइन सबसे अच्छा एक नहीं है। लेकिन यह एक और सवाल। – eraxillan

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