अंतर यह है कि आप std::unique_lock
को लॉक और अनलॉक कर सकते हैं। std::lock_guard
निर्माण पर केवल एक बार बंद कर दिया जाएगा और विनाश पर अनलॉक किया जाएगा।
तो उपयोगकेस बी के लिए आपको निश्चित रूप से std::unique_lock
की स्थिति चर के लिए आवश्यकता है। यदि ए यह निर्भर करता है कि आपको गार्ड को फिर से खोलना है या नहीं।
std::unique_lock
में अन्य विशेषताएं हैं जो इसे अन्य की अनुमति देती हैं: म्यूटेक्स को तुरंत लॉक किए बिना बनाया जाए लेकिन आरएआईआई रैपर बनाने के लिए बनाया जाए (here देखें)।
std::lock_guard
एक सुविधाजनक आरएआईआई रैपर भी प्रदान करता है, लेकिन कई म्यूटेक्स को सुरक्षित रूप से लॉक नहीं कर सकता है। यह प्रयोग किया जा सकता है जब आप एक सीमित दायरे के लिए एक आवरण, उदा .: एक सदस्य समारोह की जरूरत है:
class MyClass{
std::mutex my_mutex;
void member_foo() {
std::lock_guard<mutex_type> lock(this->my_mutex);
/*
block of code which needs mutual exclusion (e.g. open the same
file in multiple threads).
*/
//mutex is automatically released when lock goes out of scope
};
chmike द्वारा एक प्रश्न को स्पष्ट करने के लिए, डिफ़ॉल्ट std::lock_guard
द्वारा और std::unique_lock
ही हैं। तो उपर्युक्त मामले में, आप को std::unique_lock
से प्रतिस्थापित कर सकते हैं। हालांकि, std::unique_lock
में एक टैड अधिक ओवरहेड हो सकता है।
निर्देश के साथ std :: unique_lock लॉक (myMutex); म्यूटेक्स को कन्स्ट्रक्टर द्वारा लॉक किया जाएगा? –
chmike
@chmike हाँ, यह होगा। कुछ स्पष्टीकरण जोड़ा गया। – inf
यदि मैं केस ए में उपयोग कर रहा हूं, तो क्या अद्वितीय_लॉक के बजाय lock_gard का उपयोग करना अधिक कुशल होगा? – chmike