2010-10-04 11 views
15

मेरे पास boost::lock_guard (या समान स्कॉप्ड लॉक) के उपयोग से संबंधित एक प्रश्न है और return कथन में लॉक द्वारा संरक्षित किए जाने वाले चर का उपयोग करना है।संरक्षित डेटा लौटने पर लॉक_गार्ड का उपयोग कैसे करें

स्थानीय वस्तुओं को नष्ट करने और वापसी मूल्य की प्रतिलिपि बनाने का आदेश कैसा है? रिटर्न वैल्यू ऑप्टिमाइज़ेशन इस पर कैसे प्रभाव डालता है?

उदाहरण:

Data Class::GetData() 
{ 
    boost::lock_guard<boost::mutex> lock(this->mMutex); 
    return this->mData; 
} 

यह सही नहीं होगा (अगर mData चर mMutex द्वारा संरक्षित है)?

Data Class::GetData() 
{ 
    Data ret; 
    { 
     boost::lock_guard<boost::mutex> lock(this->mMutex); 
     ret = this->mData; 
    } 
    return ret; 
} 

उत्तर

18

बस अपने पहले उदाहरण के रूप में एक सीधे वापसी सही है: या मैं एक स्थानीय गुंजाइश और एक अस्थायी तरह नीचे दिखाए गए उदाहरण का उपयोग करना होगा। स्थानीय चर को नष्ट करने से पहले वापसी मूल्य का निर्माण किया जाता है, और इस प्रकार लॉक जारी होने से पहले।

0

दोनों टुकड़े बराबर हैं। वास्तव में मामले # 1 के लिए - सी ++ कंपाइलर # 2 मामले में वर्णित संरचना तैयार करेगा। तो # 1 बेहतर है।

3

स्थानीय वस्तुओं को नष्ट करने और वापसी मूल्य की प्रतिलिपि बनाने का आदेश कैसा है?

आम तौर पर, निर्माण के विपरीत क्रम में ढेर वस्तुओं को नष्ट कर दिया जाता है। जैसा कि पहले बताया गया था, आपके द्वारा निर्दिष्ट दोनों दृष्टिकोण वांछित व्यवहार प्रदान करेंगे।

रिटर्न मूल्य अनुकूलन इस पर कैसे प्रभाव डालता है?

RVO यहाँ एक चिंता का विषय नहीं होना चाहिए - एक नामित अस्थायी वस्तु बनाने (ऊपर अपने 2 उदाहरण के रूप में) की भूमि के ऊपर से बचने - यह सब करता ढेर फ्रेम बफर में सीधे उत्पादन वस्तु का निर्माण है। स्थानीय विनाशकों को बुलाए जाने से पहले यह किया जाता है।

आप ऊपर उदाहरण 1 से कोड का उपयोग कर सबसे अच्छे हैं।

संबंधित मुद्दे