2010-01-01 11 views
10

मुझे पता है कि सी ++ 03 मानक के रूप में, समारोह-गुंजाइश स्थिर initializations धागा सुरक्षित होने की गारंटी नहीं कर रहे हैं:C++ 0x स्थिर initializations और धागा सुरक्षा

void moo() 
{ 
    static std::string cat("argent"); // not thread safe 
    ... 
} 
C++ 0x के साथ

अंततः मानक थ्रेड समर्थन प्रदान करने वाले मानक, फ़ंक्शन-स्कोप स्थिर प्रारंभिक थ्रेड सुरक्षित होने के लिए आवश्यक हैं?

+3

मुझे लगता है कि आज के रूप में यह एक hexidecimal संख्या के रूप में एक्स के बारे में सोचना सी ++ 1x –

+0

Bjarne Stoustrup बुलाया जाएगा कहते हैं, इसलिए अभी भी 0x –

+0

@ जॉन: की परवाह किए बिना कि वह क्या सोच सकते हैं या की तरह, मैं समझता हूँ कि है आईएसओ दिशानिर्देशों को बेस -10 में मानकों जैसे मानकों के संस्करण की आवश्यकता होती है। –

उत्तर

9

यह आरंभीकरण, सुरक्षित थ्रेड किया जाएगा के बाद से मामले में वस्तु गतिशील समारोह प्रवेश करते समय आरंभ नहीं हो जाता है, यह एक महत्वपूर्ण खंड में निष्पादित करने के लिए गारंटी है:

§ 6.7 stmt.decl

4.। ..such एक वस्तु पहली बार नियंत्रण अपनी घोषणा के माध्यम से गुजरता आरंभ नहीं हो जाता ... नियंत्रण घोषणा समवर्ती जबकि वस्तु प्रारंभ किया जा रहा है में प्रवेश करती है, तो समवर्ती निष्पादन आरंभीकरण के पूरा होने के लिए प्रतीक्षा करेगा ...

एक संभावित एज-केस है, यदि मुख्य() से लौटने के बाद, स्थैतिक ऑब्जेक्ट का विनाशक स्थैतिक स्थानीय पहले ही नष्ट हो जाने के बाद फ़ंक्शन को कॉल करता है, तो व्यवहार अपरिभाषित होता है। हालांकि, इससे बचने के लिए आसान होना चाहिए।

+3

प्रसिद्ध अंतिम शब्द "से बचने में आसान होना चाहिए"। सामान्य मामले में इससे बचना बेहद मुश्किल है। –

+0

@deft_code: +1, हाल ही में उस पर काटा गया था। – peterchen