आपने उल्लेख नहीं किया है कि mutex
चर का प्रकार क्या है, लेकिन यह मानते हुए कि यह std::mutex
(या पारस्परिक बहिष्करण की गारंटी देने के लिए समान कुछ है), संकलक को कई अनुकूलन करने से रोका गया है। इसलिए आपको वापसी मूल्य अनुकूलन या कुछ अन्य अनुकूलन के बारे में चिंता करने की आवश्यकता नहीं है, जो size()
क्वेरी को म्यूटेक्स ब्लॉक के बाहर निष्पादित करने की इजाजत देता है।
हालांकि, जैसे ही म्युटेक्स ताला जारी की है, एक और प्रतीक्षा धागा वेक्टर पहुँच सकते हैं और संभवतः यह उत्परिवर्तित, इस प्रकार आकार बदलने के लिए स्वतंत्र है। अब, आपके फ़ंक्शन द्वारा लौटाई गई संख्या पुरानी है। चूंकि मैट पीटर्ससन ने अपने answer में उल्लेख किया है, यदि यह कोई मुद्दा है, तो म्यूटेक्स लॉक को getNumber()
के कॉलर द्वारा अधिग्रहित करने की आवश्यकता है, और जब तक कॉलर परिणाम का उपयोग नहीं कर लेता है तब तक आयोजित किया जाता है। इससे यह सुनिश्चित होगा कि ऑपरेशन के दौरान वेक्टर का आकार बदल नहीं जाता है।
स्पष्ट रूप से कॉल करना mutex::lock
mutex::unlock
के बाद जल्दी से अपवाद हैं, कई वापसी बयान आदि एक बहुत आसान विकल्प म्युटेक्स ताला प्राप्त करने के लिए std::lock_guard
उपयोग करने के लिए है को शामिल और अधिक जटिल कार्यों के लिए अव्यावहारिक हो जाता है।
int getNumber()
{
std::lock_guard<std::mutex> l(mutex); // lock is acquired
int size = someVector.size();
return size;
} // lock is released automatically when l goes out of scope
वहाँ अस्थिर की एक विवरण यहाँ है: http://stackoverflow.com/questions/154551/volatile-vs-interlocked-vs-lock – Will
@ क्या मुझे नहीं लगता कि सी # 'अस्थिर 'सी ++' अस्थिर' जैसा ही है (हालांकि यह इस स्थिति में दोनों भाषाओं में बेकार होगा)। –
ओउप्स, मैंने नहीं देखा कि उत्तर सी ++ के लिए था। अस्थिरता का एक बेहतर स्पष्टीकरण यहां दिया गया है: http://stackoverflow.com/questions/72552/why-does-volatile-exist – Will