अंतर यह है कि आप लॉक और अनलॉक कर सकते हैं 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।