मैं कारण है कि lock_guard
मौजूद है के बारे में उलझन में हूँ। है:एक कार्य के लिए unique_lock का उपयोग कर रहा है जिसे लॉक_गार्ड धीमा कर दिया जा सकता है?
unique_lock
से एक आसान इंटरफ़ेस?- बेहतर
unique_lock
से प्रदर्शन? - कुछ और?
मैं कारण है कि lock_guard
मौजूद है के बारे में उलझन में हूँ। है:एक कार्य के लिए unique_lock का उपयोग कर रहा है जिसे लॉक_गार्ड धीमा कर दिया जा सकता है?
unique_lock
से एक आसान इंटरफ़ेस?unique_lock
से प्रदर्शन?lock_guard
को राज्य की एक इकाई के साथ कार्यान्वित किया जा सकता है: Mutex
प्रकार का सूचक या संदर्भ इसे बंद कर दिया गया है।
unique_lock
दोनों कि राज्य रखें, और जानते हुए भी यदि यह वर्तमान लॉक किया गया है, के रूप में एक unique_lock
एक Mutex
कि लॉक नहीं हो सकता है की क्षमता है। इसका मतलब है कि इसमें कम से कम bool
अतिरिक्त राज्य होना चाहिए।
lock_guard
प्राप्त करने और एक Mutex
जारी चारों ओर एक शून्य भूमि के ऊपर आरए II लॉक/अनलॉक आवरण प्रदान करता है। असल में lock_guard
का अर्थ है कि Mutex
पर ताले को संभालने के लिए RAII का उपयोग करने से बचने का शून्य कारण नहीं है।
unique_lock
केवल शून्य ओवरहेड तक पहुंच सकता है यदि संकलक को नोटिस करने के लिए आश्वस्त किया जा सकता है कि आप इसे केवल lock_guard
का उपयोग कर सकते हैं (यानी इसे बनाएं, फिर इसे नष्ट कर दें, इसके बिना झुकाए)।
उन दक्षता तर्क से परे, जो एक lock_guard
देखता है एक प्रोग्रामर जानता है कि यह दायरे में कोड की जांच किए बिना गुंजाइश के अंत तक जा रहा है। एक प्रोग्रामर जो unique_lock
देखता है उसे यह जानने के लिए चर के सभी उपयोगों की जांच करनी चाहिए कि यह मामला है या नहीं।
लेकिन इसके बाद के संस्करण केवल आधा कारण है।
कारण का दूसरा आधा कारण है क्योंकि सी ++ 11 के लिए थ्रेडिंग लाइब्रेरी में से अधिकांश boost
पुस्तकालयों से दूर था, जो पहले से ही अधिकतर प्लेटफार्म स्वतंत्र थ्रेडिंग लाइब्रेरी लागू कर चुका था। बूस्ट में lock_guard
और unique_lock
दोनों हैं, सी ++ 11 संस्करणों के लगभग समान अर्थशास्त्र के साथ।
तो जब boost
सूत्रण पुस्तकालय मानकीकृत था, दोनों जहां में किया जाता है, और कोई भी उन्हें समाप्त कर दिया।
आप लगभग यहाँ अपने खुद के सवाल का जवाब - 1) और 2) दोनों अच्छे कारण हैं। std::lock_guard एक साधारण स्कॉप्ड लॉकिंग ऑब्जेक्ट है। म्यूटेक्स अधिग्रहण पर एक टाइमआउट जैसी विशेषताएं म्यूटेक्स आदिम की जटिलता को जोड़ती हैं, जो ऑपरेशन करने और म्यूटेक्स के लिए विवाद की संभावना को बढ़ाने में लगती है। तो आपको जिस चीज की आवश्यकता नहीं है उसके लिए भुगतान क्यों करें?
साथ या समय समाप्ति के बिना चाहे 'try_locking' अच्छे डिजाइन एक और सवाल है, थ्रेड रद्दीकरण की तरह, टूटा हुआ डिज़ाइन जो सी ++ 11 लागू नहीं करता है।