C ++(Qt)マルチスレッドシングルトンモードの二重検出の実現

シングルトンを見ると、デザインパターンを研究したことのある人なら誰でも、それがシングルトンモードであることを知っています。つまり、プログラムの実行時に特定の変数のインスタンスは1つだけです。

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を呼び出すスレッドが複数ある場合、おそらく1つのスレッドがposの位置に到達し、2番目のスレッドがif判定を実行しているため、インスタンスが原因でその判定も確立されます。割り当ては成功しません。

マルチスレッドの実装が必要な場合は、プロセスのpv操作と同様に、ロックに適用して、一度に1つのプロセスのみが重要なリソースにアクセスできるようにする必要があります。したがって、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