2013-10-24 5 views
13

मैं कारण है कि lock_guard मौजूद है के बारे में उलझन में हूँ। है:एक कार्य के लिए unique_lock का उपयोग कर रहा है जिसे लॉक_गार्ड धीमा कर दिया जा सकता है?

  1. unique_lock से एक आसान इंटरफ़ेस?
  2. बेहतर unique_lock से प्रदर्शन?
  3. कुछ और?

उत्तर

23

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 सूत्रण पुस्तकालय मानकीकृत था, दोनों जहां में किया जाता है, और कोई भी उन्हें समाप्त कर दिया।

6

आप लगभग यहाँ अपने खुद के सवाल का जवाब - 1) और 2) दोनों अच्छे कारण हैं। std::lock_guard एक साधारण स्कॉप्ड लॉकिंग ऑब्जेक्ट है। म्यूटेक्स अधिग्रहण पर एक टाइमआउट जैसी विशेषताएं म्यूटेक्स आदिम की जटिलता को जोड़ती हैं, जो ऑपरेशन करने और म्यूटेक्स के लिए विवाद की संभावना को बढ़ाने में लगती है। तो आपको जिस चीज की आवश्यकता नहीं है उसके लिए भुगतान क्यों करें?

साथ या समय समाप्ति के बिना चाहे 'try_locking' अच्छे डिजाइन एक और सवाल है, थ्रेड रद्दीकरण की तरह, टूटा हुआ डिज़ाइन जो सी ++ 11 लागू नहीं करता है।

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

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