आलसी तत्कालता को हल करने की कोशिश की गई चीज़ों में से एक (न केवल सी ++ संबंधित) static initialization order fiasco था। यह एक समस्या है कि प्रारंभिकरण (एकाधिक अनुवाद इकाइयों के साथ) के क्रम पर आपके पास थोड़ा नियंत्रण नहीं है, लेकिन निर्भरताओं को किसी वस्तु को पहले से मौजूद होने की आवश्यकता हो सकती है, इससे पहले कि दूसरे को बनाया जा सके। आलसी तात्कालिकता के साथ, वस्तु आवश्यकतानुसार बनाई गई है, इसलिए जब तक कोई परिपत्र निर्भरता न हो, तो आपको ठीक होना चाहिए।
यदि निर्भरताएं आपके लिए एक समस्या है और आप अभी भी प्रत्येक getInstance() के लिए लॉकिंग की लागत से बचना चाहते हैं, तो आप अभी भी अपने सभी सिंगलेट्स को आरंभ करने() फ़ंक्शन को जोड़कर अपने थ्रेड शुरू करने से पहले उत्सुकतापूर्वक कर सकते हैं तुम्हारी कक्षाएं। इस तरह आप आवेषणों से जांच सकते हैं कि सिंगलेट्स केवल एक बार आरंभ किए जाते हैं और प्रारंभ होने के बाद ही उन्हें एक्सेस किया जाता है।
टिप्पणी है कि:
- साझा संसाधन अभी भी जब वे पहुंचा जा सकता है बंद कर दिया जाना चाहिए।
सी ++ 11 से (और जीसीसी का उपयोग करते समय मुझे अन्य कंपाइलर्स के बारे में निश्चित नहीं है), सबसे आसान समाधान getInstance में स्थिर फ़ंक्शन वैरिएबल का उपयोग करना और उस चर के संदर्भ को वापस करना है। यह थ्रेड-सुरक्षित है।
class Example
{
...
static Example& getInstance()
{
static Example instance;
return instance;
}
};
दिलचस्प, कभी नहीं इसे उस तरह से इस्तेमाल करने के बारे में सोचा। मैंने हमेशा 'if (instance == null) उदाहरण = नया सिंगलटन();' का उपयोग किया। यह देखने के लिए प्रतीक्षा करें कि विशेषज्ञों को क्या कहना है –
उपरोक्त टिप्पणी सही है, इस तरह स्मृति को बचाया जा सकता है। क्योंकि जब पहला अनुरोध आता है तब वस्तु उत्पन्न की जाएगी। –
यह कुछ प्रकाश फेंक सकता है http://www.devarticles.com/c/a/Cplusplus/C-plus-plus-In-Theory-The-Singleton-Pterntern-Part-I/4/ – DumbCoder