Singletonãã¿ã¼ã³ã¨ãã«ãã¹ã¬ãã
ãã«ãã¹ã¬ãããèæ ®ãã¦Singletonãå®è£ ããã¨ããã¢ã¯ã»ã¹ãã度ã«TCriticalSectionã使ã£ã¦ãªãã¸ã§ã¯ãã®ä¸èº«ãä¿è·ãã¦ãããªãã¨ãããªãã®ããªã»ã»ã»ã
class CSingleton { private: CSingleton(){} CSingleton(const CSingleton& obj) {} virtual ~CSingleton(){} public: static CSingleton& getInstance(); static void release(); private: static CSingleton* s_pInstance; }; CSingleton& CSingleton::getInstance() { if (s_pInstance == NULL) { // ã·ã³ã°ã«ãã³ãªãã¸ã§ã¯ãã®åæå // TCriticalSectionã¯æä»å¶å¾¡ãè¡ãVCLã¯ã©ã¹ // unique_ptrã£ã¦ã¹ã¬ããã»ã¼ãã ã£ãï¼ std::unique_ptr<TCriticalSection> pCriticalSection(new TCriticalSection); // ãªã½ã¼ã¹ã®æä»å¶å¾¡éå§ pCriticalSection->Enter(); // TCriticalSectionã®çææã«å¥ã¹ã¬ãããåæåãã¦ãããããããªãã®ã§ãããä¸åº¦ãã§ãã¯ã // æè¬"double-checked locking"ã if (s_pInstance == NULL) { s_pInstance = new CSingleton(); } // æä»å¶å¾¡çµäº pCriticalSection->Release(); } return *s_pOptions; } // newããã®ã§çµäºæã«è§£æ¾ãã¦ããã void TCriticalSection::release() { if (s_pInstance != NULL) { // 解æ¾æãæä»å¶å¾¡ãå¿ è¦ std::unique_ptr<TCriticalSection> pCriticalSection(new TCriticalSection); pCriticalSection->Enter(); if (s_pInstance != NULL) { delete s_pInstance; pInstance = NULL; } pCriticalSection->Release(); } }
ä»ã¾ã§ãSingletonã¯ãMeyersã®Singletonãã§å®è£ ãã¦ãããã©ãC++Builder 2009ããã¯"è¦å W8104 test.cpp 13: ãã«ãã¹ã¬ãã ã¢ããªã±ã¼ã·ã§ã³ã®ã³ã³ã¹ãã©ã¯ã¿ã§ãã¼ã«ã«éçå¤æ°ã使ããã¨ã¯å±éº"ã¨åºåãããããã«ãªã£ãã
class CSingleton { private: CSingleton() {} CSingleton(const CSingleton& obj) {} public: virtual ~CSingleton() {} public: CSingleton& getInstance(); }; CSingleton& CSingleton::getInstance() { static CSingleton instance; // W8104ãçºçã return instance; }
ãããããè³æºã®ä¿è·ã¨ããèããªããã°ãããªãã¨ãã¢ã¯ã»ãµã§ããè³æºã®ä¿è·ãå¿
è¦ãªã®ãããå¤ãããå°ãªãã¨ããã·ã³ã°ã«ãã³ãªãã¸ã§ã¯ãã®èªã¿æ¸ãæã¯æä»å¶å¾¡ããªãã¨ãããªãããã ã('A`)ï¾ï¾ï¾ï¾ï½¸ï½¾
ここã¨ãここã«ããã¨ãdouble-checked lockingãçµæ§åé¡ãæ±ãã¦ãããã ãã»ã»ã»ã('A`)
å®ç§ãªãã¹ã¬ããã»ã¼ãããªãã¦ããã»ã©ã®ãã¨ãããªãã¨å®ç¾åºæ¥ããã«ãªããªã(´・Ïï½¥`)ショï¾ï¾ï½°ï¾