c++ 單例模式


1
一個類只有一個實例:通常建立實例的代碼可能會涉及到線程安全方面的問題,需注意,代碼以下: 2 #include <iostream> 3 using namespace std; 4 #define HUNGRY_MODE // 餓漢模式,在一開始就建立 5 #define LAZY_MODE // 懶漢模式,在須要的時候才建立 6 class DSingletonMode{ 7 private: 8 static DSingletonMode *m_pSingletonInstance; 9 private: 10 DSingletonMode(){ /* Constructor */} 11 DSingletonMode(const DSingletonMode &other){ 12 // Copy constructor 13 } 14 DSingletonMode operator = (const DSingletonMode &other){ 15 // Assignment constructor 16 } 17 public: 18 // Get singleton mode object, and it can have parameters 19 static DSingletonMode *GetSingletonInstance(void){ 20 /* 21 These code has thread self question 22 */ 23 #ifdef LAZY_MODE 24 Lock(); 25 if (NULL == m_pSingletonInstance) 26 { 27 /* code */ 28 m_pSingletonInstance = new DSingletonMode(); 29 } 30 unlock(); 31 #endif 32 33 return (m_pSingletonInstance); 34 } 35 void OtherFunction(/* Parameters */){ 36 // Do something 37 cout<<"I can do anything!"<<endl; 38 } 39 } 40 #ifdef HUNGRY_MODE 41 static DSingletonMode *DSingletonMode::m_pSingletonInstance = new DSingletonMode(); 42 #else 43 static DSingletonMode *DSingletonMode::m_pSingletonInstance = NULL; 44 #endif

對於上述編譯可能存在錯誤,由於類的靜態變量須要放在源文件而不是頭文件進行顯式的初始化;ios

還有對於懶漢模式可能存在線程安全問題,因此對於建立單例那裏須要進行上鎖設置,對於windows能夠採用臨界區,可用以下代碼代替:windows

// 添加類的私有成員
private:
    CCriticalSection m_section; 

// 改寫返回實例的函數
static DSingletonMode *GetSingletonInstance(void){
            /*
            These code has thread self question
             */
            #ifdef LAZY_MODE
            // Lock(); 實現線程安全(realize thread safe)
            m_section.Lock(0);
            if (NULL == m_pSingletonInstance)
            {
                /* code */
                m_pSingletonInstance = new DSingletonMode();
            }
            // unlock();
            m_section.Unlock();
            #endif
            
            return (m_pSingletonInstance);
        }

臨界區能夠對某段代碼進行加鎖,直到釋放權限。安全

之後會進行改進!函數

相關文章
相關標籤/搜索