C ++ 17 ने एक नया लॉक क्लास बुलाया std::scoped_lock
।
प्रलेखन से देखते हुए यह पहले से मौजूद std::lock_guard
वर्ग के समान है ।
क्या अंतर है और मुझे इसका उपयोग कब करना चाहिए?
C ++ 17 ने एक नया लॉक क्लास बुलाया std::scoped_lock
।
प्रलेखन से देखते हुए यह पहले से मौजूद std::lock_guard
वर्ग के समान है ।
क्या अंतर है और मुझे इसका उपयोग कब करना चाहिए?
जवाबों:
scoped_lock
की एक सख्ती से बेहतर संस्करण है lock_guard
कि मनमाने ढंग से एक ही बार में mutexes सभी की संख्या (के रूप में ही गतिरोध-परिहार कलन विधि का उपयोग ताले std::lock
)। नए कोड में, आपको केवल कभी भी उपयोग करना चाहिए scoped_lock
।
एकमात्र कारण lock_guard
अभी भी मौजूद है संगतता के लिए। इसे केवल हटाया नहीं जा सकता था, क्योंकि इसका उपयोग वर्तमान कोड में किया जाता है। इसके अलावा, यह अपनी परिभाषा को बदलने के लिए अवांछनीय साबित हुआ (एकात्मक से वेरैडिक तक), क्योंकि यह भी एक अवलोकन योग्य है, और इसलिए तोड़ना, बदलना (लेकिन कुछ तकनीकी कारणों से)।
lock_guard
। लेकिन यह निश्चित रूप से गार्ड कक्षाओं को उपयोग करने के लिए थोड़ा आसान बनाता है।
एकल और महत्वपूर्ण अंतर यह है कि std::scoped_lock
एक से अधिक म्यूटेक्स लेने वाला एक वैराडिक निर्माता है। यह कई म्यूटेक्स को गतिरोध से बचने के तरीके से लॉक करने की अनुमति देता है जैसे कि std::lock
इस्तेमाल किया गया था।
{
// safely locked as if using std::lock
std::scoped_lock<std::mutex, std::mutex> lock(mutex1, mutex2);
}
पहले आपको इस उत्तरstd::lock
को समझाते हुए कई म्यूटेक्स को सुरक्षित तरीके से लॉक करने के लिए थोड़ा नृत्य करना था ।
स्कोप लॉक को जोड़ने से संबंधित त्रुटियों का उपयोग करना और बचना आसान हो जाता है। आप std::lock_guard
पदावनत विचार कर सकते हैं । एकल तर्क मामले std::scoped_lock
को एक विशेषज्ञता के रूप में लागू किया जा सकता है और इस तरह आपको संभावित प्रदर्शन मुद्दों के बारे में डरने की ज़रूरत नहीं है।
जीसीसी 7 के पास पहले से ही समर्थन है std::scoped_lock
जिसके लिए यहां देखा जा सकता है ।
अधिक जानकारी के लिए आप मानक पेपर पढ़ना चाह सकते हैं
scoped_lock lk; // locks all mutexes in scope
। LGTM।
scoped_lock lk;
के लिए नया आशुलिपि है scoped_lock<> lk;
। वहाँ रहे हैं कोई mutexes। तो आप सही हैं। ;-)
देर से जवाब, और ज्यादातर के जवाब में:
आप
std::lock_guard
पदावनत विचार कर सकते हैं ।
उस सामान्य मामले के लिए जिसे किसी एक म्यूटेक्स को लॉक करने की आवश्यकता है, std::lock_guard
एक एपीआई है जो उपयोग करने के लिए थोड़ा सुरक्षित है scoped_lock
।
उदाहरण के लिए:
{
std::scoped_lock lock; // protect this block
...
}
उपरोक्त स्निपेट में आकस्मिक रन-टाइम त्रुटि होने की संभावना है क्योंकि यह संकलन करता है और फिर बिल्कुल कुछ नहीं करता है। कोडर शायद मतलब है:
{
std::scoped_lock lock{mut}; // protect this block
...
}
अब यह लॉक / अनलॉक हो जाता है mut
।
यदि lock_guard
इसके बजाय ऊपर के दो उदाहरणों में उपयोग किया गया था, तो पहला उदाहरण रन-टाइम त्रुटि के बजाय एक संकलन-समय त्रुटि है, और दूसरा उदाहरण संस्करण की समान कार्यक्षमता है जो उपयोग करता है scoped_lock
।
इसलिए मेरी सलाह है कि नौकरी के लिए सबसे सरल टूल का उपयोग करें:
lock_guard
यदि आपको संपूर्ण दायरे के लिए ठीक 1 म्यूटेक्स को लॉक करने की आवश्यकता है।
scoped_lock
यदि आपको कई म्यूटेक्स को लॉक करने की आवश्यकता है जो कि ठीक 1 नहीं है।
unique_lock
यदि आपको ब्लॉक के दायरे में अनलॉक करने की आवश्यकता है (जिसमें उपयोग शामिल है condition_variable
)।
यह सलाह का अर्थ यह नहीं है कि scoped_lock
0 म्यूटेक्स को स्वीकार नहीं करने के लिए फिर से डिज़ाइन किया जाना चाहिए। ऐसे वैध उपयोग के मामले मौजूद हैं जहां यह scoped_lock
वैरेडिक टेम्प्लेट पैरामीटर पैक को स्वीकार करने के लिए वांछनीय है जो खाली हो सकता है। और खाली मामले को कुछ भी लॉक नहीं करना चाहिए ।
और इसीलिए lock_guard
पदावनत नहीं किया जाता है। scoped_lock
और unique_lock
की कार्यक्षमता का सुपरसेट हो सकता है lock_guard
, लेकिन यह तथ्य एक दोधारी तलवार है। कभी-कभी यह उतना ही महत्वपूर्ण होता है जितना एक प्रकार क्या नहीं करेगा (इस मामले में डिफ़ॉल्ट निर्माण)।
यहाँ क्रिया में C ++ Concurrency से एक नमूना और उद्धरण है :
friend void swap(X& lhs, X& rhs)
{
if (&lhs == & rhs)
return;
std::lock(lhs.m, rhs.m);
std::lock_guard<std::mutex> lock_a(lhs.m, std::adopt_lock);
std::lock_guard<std::mutex> lock_b(rhs.m, std::adopt_lock);
swap(lhs.some_detail, rhs.some_detail);
}
बनाम
friend void swap(X& lhs, X& rhs)
{
if (&lhs == &rhs)
return;
std::scoped_lock guard(lhs.m, rhs.m);
swap(lhs.some_detail, rhs.some_detail);
}
के अस्तित्व
std::scoped_lock
का मतलब है कि मामलों तुम कहाँ का इस्तेमाल किया है | के सबसेstd::lock
c ++ 17 से पहले अब का उपयोग कर लिखा जा सकता हैstd::scoped_lock
गलतियों के लिए कम क्षमता के साथ, है, जो केवल एक अच्छी बात हो सकती है!