अंतर यह है कि आप लॉक और अनलॉक कर सकते हैं std::unique_lock
। std::lock_guard
केवल एक बार निर्माण पर लॉक किया जाएगा और विनाश पर अनलॉक किया जाएगा।
इसलिए केस बी के उपयोग के लिए आपको निश्चित रूप std::unique_lock
से कंडीशन वैरिएबल की जरूरत है । मामले में ए यह निर्भर करता है कि आपको गार्ड को अनलॉक करने की आवश्यकता है या नहीं।
std::unique_lock
अन्य विशेषताएं हैं जो इसे अनुमति देती हैं जैसे: म्यूटेक्स को तुरंत लॉक किए बिना निर्माण किया जाना चाहिए लेकिन आरएआईआई रैपर का निर्माण ( यहां देखें )।
std::lock_guard
एक सुविधाजनक RAII आवरण भी प्रदान करता है, लेकिन कई म्यूटेक्स को सुरक्षित रूप से लॉक नहीं कर सकता है। इसका उपयोग तब किया जा सकता है जब आपको सीमित दायरे के लिए रैपर की आवश्यकता होती है, जैसे: एक सदस्य फ़ंक्शन:
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::lock_guard
साथ बदल सकते हैं std::unique_lock
। हालांकि, std::unique_lock
एक बालक अधिक उपरि हो सकता है।
ध्यान दें कि इन दिनों के std::scoped_lock
बजाय एक का उपयोग करना चाहिए std::lock_guard
।