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