C++線程安全的單例模式


#include <iostream>   
  
  
class Singleton  
{  
public :  
    static Singleton* GetInstance( )           // 獲取對象單例的指針   
    {  
        // 此處進行了兩次m_Instance == NULL的判斷,   
        // 是借鑒了Java的單例模式實現時,   
        // 使用的所謂的“雙檢鎖”機制。   
        // 因為進行一次加鎖和解鎖是需要付出對應的代價的,   
        // 而進行兩次判斷,就可以避免多次加鎖與解鎖操作,   
        // 同時也保證了線程安全   
        if(Singleton::m_singleton == NULL)          //   
        {  
            Lock( );            // 此處可以調用其他庫的鎖線程,或者自己實現一個   
            if(Singleton::m_singleton == NULL)       // 如果單例對象沒有創建, 則將其創建   
            {  
                Singleton::m_singleton = new Singleton( );  
            }  
            Unlock( );      // 此處可以調用其他庫的鎖線程,或者自己實現一個   
        }  
        return Singleton::m_singleton;  
    }  
    static void DestroyInstance( )                  // 銷毀單例對象的空間   
    {  
        if(Singleton::m_singleton != NULL)  
        {  
            delete Singleton::m_singleton;  
            Singleton::m_singleton = NULL;  
        }  
    }  
private :  
    Singleton( )                                // 構造函數[被保護]   
    {  
  
    }  
  
    Singleton(const Singleton &singleton)       // 賦值構造函數[被保護]   
    {  
  
    }  
  
    ~Singleton( )                               // 析構函數   
    {  
    }  
  
    static Singleton *m_singleton;                // 指向單例對象的指針   
};  
  
int main()  
{  
    Singleton *sp1 = Singleton::GetInstance( );  
    Singleton *sp2 = Singleton::GetInstance( );  
  
    std::cout <<(sp1 == sp2) <<std::endl;  
  
    Singleton::DestroyInstance( );  
  
    return 0;  
}  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM