美文网首页
c++ 单例模式

c++ 单例模式

作者: yangqi916 | 来源:发表于2017-02-27 19:05 被阅读0次
    class CSingleton  
    {  
    private:  
        CSingleton()   //构造函数是私有的  
        {  
        }  
        static CSingleton *m_pInstance;  
    public:  
        static CSingleton * GetInstance()  
        {  
            if(m_pInstance == NULL)  //判断是否第一次调用  
                m_pInstance = new CSingleton();  
            return m_pInstance;  
        }  
    };  
    

    链接

    为什么要用double checking

    之前在使用Double Check Locking 模式时,发现自己还是不太理解。于是写个记录,其实很简单,一看就明白了。
    应用特别说明:
    1.Double Check Locking模式是singleton的多线程版本,如果是单线程则应使用singleton。
    2.Double Check Locking模式依就会使用锁——临界区锁定,不要以为可以避免使用锁。
    3.Double Check Locking 解决的问题是:当多个线程存在访问临界区企图时,保证了临界区只需要访问一次。
    下面是其适用特点:
    1.多个线程试图并发访问一个临界区;
    2.临界区只需执行一次;
    分析如下3种方法:
    //class singleton
    //:s1-
    singleton* get_instance(void)
    {
    lock();
    if( instance == 0) {
    instance = new singleton;
    }
    unlock();
    return instance;
    }
    *存在的问题是:无论是否已经初始化都要加锁,增加了负荷,已经没有所谓的并发性能了。
    //:s-2
    singleton
    get_instance(void)
    {
    if( instance == 0){
    lock();
    instance = new singleton;
    unlock();
    }
    return instance;
    }
    *存在的问题是:不能保证临界区只初始化一次,没能实现singleton的基本功能;
    //:s-3
    singleton
    get_instance(void)
    {
    if( instance == 0){
    lock();
    if( instance == 0 )
    instance = new singleton;
    unlock();
    }
    return instance;
    }
    **解决路上述问题——双检锁模式。

    相关文章

      网友评论

          本文标题:c++ 单例模式

          本文链接:https://www.haomeiwen.com/subject/utftgttx.html