c++(Qt)多线程单例模式的双检测实现

看到Singleton,学过设计模式的都知道,就是单例模式,意思是保证程序在执行时某个变量只有一个实例。

class Singleton {
public:
     static Singleton * getInstance() {}
private:
     Singleton(): {}
     ~Singleton(): {}
     static Singleton * instance;
}
 
Singleton * Singleton::instance = nullptr;
 
Singleton * Singleton::getInstance(){
    if(!instance){
        instance = new Singleton;    //pos
    }
    return instance; 
}

以上的代码只是对于单线程的,因为如果有多个线程调用getInstance,可能一个线程刚走到pos的位置,第二个线程在做if判断,那么它判断也会成立,因为此时instance并未赋值成功。

如果需要多线程实现,要应用到锁,类似进程pv操作,保证同一时间只有一个进程访问临界资源。所以getInstance()可以改成

Singleton*Singleton::getInstance()
{
    static QMutex mutex;
    if(!instance)
    {
        QMutexLocker locker(&mutex);
        if(!instance)
        {
            instance = new Singleton;
        }
    }
    return instance;
}

猜你喜欢

转载自blog.csdn.net/weixin_41882459/article/details/112831234