2016-03-28 12 views
5
void HelloWorld() 
{ 
    static std::atomic<short> static_counter = 0; 
    short val = ++static_counter; // or val = static_counter++; 
} 

इस समारोह दो धागे से कहा जाता है, तोथ्रेड सुरक्षित स्थानीय चर

स्थानीय चर दोनों धागे में 1 हो val कर सकते हैं? या (का उपयोग किया जाता है?)

+1

संभावित डुप्लिकेट http://stackoverflow.com/questions/8102125/is-local-static-variable-initialization-thread-safe-in-c11 – user2807083

+0

@ user2807083 यह सवाल नहीं है। मुझे पता है static_counter सुरक्षित रूप से शुरू किया जाएगा। सी ++ 11 मानक की आवश्यकता है। मैं वैल के बारे में बात कर रहा हूं, जो स्थिर नहीं है .. – James

+1

मुझे लगता है कि यह आपके स्थानीय 'var' के बारे में कुछ भी नहीं है, लेकिन सभी ++ ऑपरेटर स्थिर चर पर लागू होते हैं। तो मुझे लगता है कि सही सवाल यह है कि "परमाणु चर धागा सुरक्षित है?" – user2807083

उत्तर

2

क्या स्थानीय चर वैल दोनों धागे में हो सकता है?

fetch_add(1)+1 

जो वापस नहीं लौट सकते दो (या अधिक) के लिए ही मूल्य धागे क्योंकिfetch_add atomically निष्पादित होने

सं ++static_counter के बराबर है।

+0

क्या यह static_counter ++ के लिए भी लागू होता है? – James

+0

हां। यह 'fetch_add (1)' के बराबर है। अधिक जानकारी के लिए कृपया [डॉक्टर] (http://en.cppreference.com/w/cpp/atomic/atomic/operator_arith) पढ़ें। – Nawaz

+0

इसमें दो चीजें शामिल हैं, 'static_counter' ऑब्जेक्ट का निर्माण और वृद्धि कार्य। उत्तरार्द्ध परमाणु होने की गारंटी है, लेकिन टिप्पणियों के लिंक के अनुसार, निर्माण नहीं है। –

2

नहीं। val का एकमात्र तरीका दोनों धागे में समान मूल्य हो सकता है यदि दो परमाणु संचालन ओवरलैप हो। परिभाषा के अनुसार, परमाणु संचालन ओवरलैप नहीं हो सकता है।

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