2010-07-19 12 views
6

मैं एक विशेष (और अन्यथा सामान्य) वर्ग (जिस स्रोत का मैं संशोधित कर सकता हूं) को तुरंत चालू करने में सक्षम होना चाहता हूं और वर्ग को तत्काल (जैसे like this) की संख्या की गणना करना चाहता हूं। लेकिन मैं अपनी कुल गिनती में सभी उदाहरणों को शामिल करना चाहता हूं, यहां तक ​​कि कुछ जो मानक कंटेनर में कॉपी कन्स्ट्रक्टर के माध्यम से बनाए जाते हैं।मैं अपने कार्यक्रम के भीतर कक्षा के सभी * उदाहरणों को सुरक्षित रूप से (और आसानी से) कैसे गिन सकता हूं?

क्या मेरे वर्ग की वृद्धि के सभी रचनाकारों (प्रतिलिपि निर्माता सहित) एक स्थिर काउंटर बढ़ाना उचित होगा? यदि हां, तो क्या यह सुनिश्चित करना संभव है कि मेरी कक्षा अभी भी मानक कंटेनरों की आवश्यकताओं के अनुरूप है (यानी, टी (एक्स) एक्स के बराबर है), उदाहरण के लिए अन्य ऑपरेटरों को ओवरराइड करके?

+0

क्या आपका मतलब कक्षा * या संदर्भ-गणना योजना के सभी उदाहरण हैं जहां आप गिनती करते हैं * सभी उदाहरण जो एक ही संसाधन * का संदर्भ देते हैं? –

+0

मेरा मतलब कक्षा के सभी उदाहरण हैं। – sje397

+0

क्या आप सिंगलटन चाहते हैं? –

उत्तर

8

स्थिर वर्ग चर के रूप में वैश्विक चर के रूप में सोचें जो कि कक्षा के नामस्थान में है। इसके साथ अन्य चीजों को बढ़ाने या करने से अन्य कोड पर कोई दुष्प्रभाव नहीं होंगे, यानी आपके कन्स्ट्रक्टर और अन्य ऑपरेटर पहले जैसा व्यवहार करेंगे।

आईई, आप सही हैं: सभी रचनाकारों में बस वृद्धि और विनाशक में कमी।


बेशक

, के रूप में जॉर्ज ने कहा, यदि आप इसे सुरक्षित multithreading करना चाहते हैं, तो आप अपने काउंटर चर (उदाहरण के लिए कुछ म्युटेक्स) के लिए उपयोग के आसपास कुछ multithreading सुरक्षित कोड जोड़ने की जरूरत। या जैसा कि स्टीवन ने बताया, आप परमाणु वृद्धि/कमी निर्देशों का भी उपयोग कर सकते हैं (लेकिन उपयोग मंच पर निर्भर करेगा)। वे बहुत तेज होंगे। हालांकि, आपको सावधान रहना होगा क्योंकि कुछ मामलों में जो बहु-प्रोसेसर वातावरण में काम नहीं करेंगे। आप सुरक्षित पक्ष पर रहने के लिए बूस्ट के atomic_count का उपयोग कर सकते हैं।

+0

विनाशक में गिनती घटाना आपको समय पर किसी दिए गए बिंदु पर उदाहरणों की गिनती देगा। यदि @ sje397 केवल "कक्षा को तत्काल समय की संख्या की गणना करना चाहता है", प्रत्येक रचनाकारों में वृद्धि करना पर्याप्त होना चाहिए। – Johnsyweb

+0

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

+0

एक साधारण काउंटर के लिए, आप परमाणु वृद्धि/कमी निर्देश का उपयोग कर दूर हो सकते हैं। विवरण आपके मंच पर निर्भर करेगा। –

9

इसे पूरा करने का एक आम तरीका एक क्लास टेम्पलेट के साथ है जिसे आप प्राप्त करते हैं।

template <typename T> 
class Countable 
{ 
    static unsigned cs_count_; 
public: 
    Countable() { ++cs_count_; } 
    Countable(Countable const&) { ++cs_count_; } 
    virtual ~Countable() { --cs_count_; } 
    static unsigned count() { return cs_count_; } 
}; 

template <typename T> 
unsigned Countable<T>::cs_count_ = 0; 

तो यह उपयोग करने के लिए मैं लिखने होगा:

class MyClass : public Countable<MyClass> { }; 

नीचे एक धागा के लिए सुरक्षित संस्करण। यह वृद्धि प्लेटफॉर्म पर वृद्धि, कमी, और पढ़ने के संचालन परमाणु सुनिश्चित करने के लिए बढ़ावा से एक वर्ग का उपयोग करता है।

#include <boost/detail/atomic_count.hpp> 

template <typename T> 
class Countable 
{ 
    static boost::detail::atomic_count cs_count_; 
protected: 
    ~Countable() { --cs_count_; } 
public: 
    Countable() { ++cs_count_; } 
    Countable(Countable const&) { ++cs_count_; } 
    static unsigned count() { return cs_count_; } 
}; 

template <typename T> 
boost::detail::atomic_count Countable<T>::cs_count_(0); 
+0

+1। लेकिन यह उन मामलों में से एक है जहां मैं वर्चुअल डॉटर ओवरकिल पर विचार करता हूं क्योंकि मुझे उम्मीद है कि किसी को भी 'काउंटरबल *' के माध्यम से हटाने की उम्मीद न करें - बस डीटीओ को इसे अस्वीकार करने के लिए सुरक्षित करें और आप सुरक्षित हैं। –

+0

वाह मैंने कभी ऐसा नहीं माना। चीयर्स! –

+0

देखें कि क्या आप धागे का उपयोग कर रहे हैं। आपको गिनती तक पहुंचने की आवश्यकता होगी। और फिर आप गणना योग्य के स्थिर उदाहरणों के लिए प्रारंभिक मुद्दों के क्रम में भाग सकते हैं, क्योंकि आपको स्थिर गणना करने से पहले मौजूद mutex की आवश्यकता होगी - इसलिए आपको म्यूटेक्स तक पहुंचने के लिए कुछ सुरक्षित सिंगलटन पैटर्न देखना होगा। –

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

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