2016-06-06 12 views
8

क्या यह वैश्विक कार्य स्थैतिक प्रारंभिकता से पीड़ित हो सकता है?std :: thread :: hardware_concurrency और स्थैतिक प्रारंभिक

template <typename TFn> 
void ParallelFor(int iIni,int iFin,TFn Fn)  
{ 
    static const unsigned int NThread= std::thread::hardware_concurrency(); 
    // ...  
} 
+5

असंबद्ध नाइटपिक: ध्यान दें कि प्रत्येक एनटीएचड चर प्रत्येक डिस्टिन के लिए मौजूद होगा फ़ंक्शन टेम्पलेट का सीटी तत्कालता। – rubenvb

उत्तर

7

इस वैश्विक समारोह स्थिर प्रारंभ असफलता से ग्रस्त कर सकते हैं?

नहीं, ऐसा नहीं होगा। आप सुरक्षित हैं ... :-)

सी ++ मानक प्रारूप (जोर मेरा) का हवाला देते हुए ...

$6.7: 4: स्थिर भंडारण अवधि के साथ एक ब्लॉक गुंजाइश चर के गतिशील प्रारंभ ([बुनियादी .stc.static]) या थ्रेड स्टोरेज अवधि ([basic.stc.thread]) पहली बार नियंत्रण किया जाता है इसकी घोषणा के माध्यम से गुजरता है; इस तरह के चर को माना जाता है जो इसकी प्रारंभिक समाप्ति पर शुरू होता है। यदि प्रारंभिकता अपवाद फेंकने से निकलती है, तो प्रारंभिकता पूर्ण नहीं होती है, इसलिए अगली बार नियंत्रण घोषणा में प्रवेश करने की कोशिश की जाएगी। नियंत्रण समवर्ती घोषणा में प्रवेश करती है जबकि चर प्रारंभ किया जा रहा है, समवर्ती निष्पादन आरंभीकरण पूरा करने के लिए

भी इंतजार करेगा, देखें: Static local variables

अपने कार्य एक समारोह टेम्पलेट template <typename TFn> है के बाद से , प्रत्येक अलग तत्काल (TFn का प्रतिस्थापन), static const unsigned int NThread = std::thread::hardware_concurrency(); का मूल्यांकन किया जाएगा

+1

और संस्करण 2015 के बाद से, यह माइक्रोसॉफ्ट विजुअल स्टूडियो पर भी काम करता है ... – rubenvb

+0

कूल। लेकिन क्या होगा यदि फ़ंक्शन को स्थिर ऑब्जेक्ट ([link] (https://isocpp.org/wiki/faq/ctors#static-init-order) के कन्स्ट्रक्टर में तत्काल चालू किया गया हो)? – metalfox

+0

@metalfox, आपके प्रश्न के लिए: अभी भी कोई समस्या नहीं होगी! याद रखें, आपका स्थिर चर * फ़ंक्शन ब्लॉक स्कोप * में है। यह पहली बार आरंभ होने की गारंटी है जब इसे रनटाइम पर ** ** जो भी ** कहा जाता है। (उद्धृत पैराग्राफ को दोहराएं)। आपका लिंक एक अलग परिदृश्य से संबंधित है यानी जब ऑब्जेक्ट्स * वैश्विक दायरे में हैं *: उस स्थिति में आपका उत्तर [अगले खंड] में है (https://isocpp.org/wiki/faq/ctors#static-init-order -पहले-उपयोग) – WhiZTiM

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