静态方法GetUI是使用鼠标事件来调用的,但是从调试中注意到,在某些非常罕见的情况下,随着鼠标事件的激增,构造函数被调用了两次。

问题是调度程序在构建过程中暂停,切换到另一个任务流程调用,该调用也开始创建另一个实例吗?

    Object* Interface::instance = 0;

    Object* Interface::GetUI() {
        if (instance == 0) {
            instance = new Interface();
        }
        return instance;
    }

最佳答案

实际上,您应该锁定单例,否则,在进行多线程处理时,您将创建多个实例。
对于C ++ 11,可以按以下方式使用它。

#include <mutex>

class Singleton
{
    static Singleton *singletonInstance;
    Singleton() {}
    static std::mutex m_;

    public:

    static Singleton* getSingletonInstance()
    {
        std::lock_guard<std::mutex> lock(m_);
        if(singletonInstance == nullptr)
        {
            singletonInstance = new Singleton();
        }
        return singletonInstance;
    }
}

关于c++ - C++ Singleton类创建多个实例,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23778410/

10-13 07:03