2009-12-26 13 views
21

निम्नलिखित संसाधनों के अनुसार, सी ++ (विशेष रूप से विज़ुअल सी ++) में स्थिर स्थिर वैरिएबल प्रारंभिक धागा सुरक्षित नहीं है। लेकिन, वैश्विक स्थैतिक चर सुरक्षित हैं।सी ++ स्थिर सदस्य परिवर्तनीय प्रारंभिक धागा-सुरक्षित है?

Thread-safe static variables without mutexing?

http://blogs.msdn.com/oldnewthing/archive/2004/03/08/85901.aspx

तो, स्थिर सदस्य चर धागा सुरक्षित के साथ कोड पीछा कर रहा है?

class TestClass 
{ 
public: 
    static MyClass m_instance; 
} 

Myclass TestClass::m_instance; 

अग्रिम धन्यवाद!

+1

5 साल बाद भी सच लगता है: http://blogs.msdn.com/b/vcblog/archive/2013/12/02/c-11-14-core-language-features-in-vs-2013- और-द-नव-2013-ctp.aspx (देखें "जादू सांख्यिकी") :) – mlvljr

+0

जाहिर है, [वीएस 2015 आखिरकार इसे ठीक करता है] (http://stackoverflow.com/a/28098631/1505939) –

उत्तर

32

यह स्कोप्ड बनाम ग्लोबल्स की बजाय फ़ंक्शन-स्कोप्ड स्थिर चर बनाम अन्य सभी प्रकार के स्थैतिक चर बनाम प्रश्न का एक प्रश्न है।

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

+4

मानक यह भी चुप है कि गैर-फ़ंक्शन-स्कोप्ड स्टेटिक्स कई धागे के साथ कैसे बनाए जाते हैं। आईआईआरसी की गारंटी है कि ऑब्जेक्ट को प्रारंभ किया जाता है, अनुवाद इकाई में किसी भी अन्य कोड को निष्पादित किया जाता है (यानी, कोड प्रारंभकर्ताओं द्वारा नहीं कहा जाता है)। यदि आप मानते हैं कि कोड (डी) निष्पादित होने के बाद लोड होने वाले डीएल में हो सकता है, तो आप देखते हैं कि यह सबसे अच्छा है कि यथार्थवादी रूप से गारंटी दी जा सकती है। यह विशेष थ्रेडिंग विनिर्देश है जो सी ++ मानक नहीं, और गारंटी देता है। –

+0

जी ++ (जैसा कि जीसीसी में है) ग्लोबल और फ़ंक्शन स्थिर चर दोनों के थ्रेड सुरक्षित प्रारंभिकरण की गारंटी देता है और शुरुआतीकरण के दौरान अन्य धागे को अवरुद्ध करने के लिए आवश्यक कोड को पौधों की गारंटी देता है। –

+7

जीसीसी फ़ंक्शन स्तरीय स्टेटिक्स थ्रेडसेफ (ध्वज द्वारा अक्षम किया जा सकता है) बनाने के लिए ताले का उपयोग करता है। विजुअल सी ++ के अधिकांश (सभी?) संस्करणों में थ्रेडसेफ फ़ंक्शन स्तर की स्थिरता नहीं है। – tony

2

हां (*)। जब वैश्विक सांख्यिकी शुरू की जाती है, तो वहां केवल एक धागा होता है और सभी रचनाकारों को बुलाया जाता है। हालांकि, यह कार्य की स्थिरताओं के लिए सच नहीं है।

(*) कोई भी संभवतः वैश्विक संरचनाओं को कुछ रचनाकारों में धागे बनाकर थ्रेड-सुरक्षित नहीं बना सकता है और इन धागे पर कुछ प्रारंभिक चरणों को शेड्यूल कर सकता है। इस मामले में सामान्य थ्रेड सुरक्षा नियम लागू होते हैं।

+0

मैं थ्रेड बना सकता हूं रचनाकारों में यदि यह आखिरी कार्यक्रम है जिसे मैं लिख रहा हूं ;-) – Varuna

+1

@ वरुन: कभी-कभी आपके पास कोई विकल्प नहीं है या आप यह भी नहीं जानते कि आपके रचनाकारों में धागे बनाए गए हैं। यह आमतौर पर तब होता है जब वस्तुओं का निर्माण किया जा रहा है तीसरे पक्ष के पुस्तकालयों का उपयोग कर रहे हैं। – Rom

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