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;  
}  

 

posted on 2018-03-26 14:47  GnibChen  阅读(1411)  评论(0编辑  收藏  举报