美文网首页
线程安全的单例模式

线程安全的单例模式

作者: 星月西 | 来源:发表于2017-04-10 20:31 被阅读22次

    单例模式,保证一个类仅有一个实例,并提供一个访问它们的全局访问点。
    而在多线程的环境下,如果多个线程调用getInstance,可能会创建出多个对象,因此需要用互斥量来保护临界区。这里使用了C++11的mutex互斥量,同时使用lock_guard对象,使用RAII的思想保护临界区。

    class Singleton
    {
    public:
        static Singleton* getInstance()
        {
            //先判断实例是否存在,不存在再加锁处理
            if(instance==nullptr)
            {
                lock_guard<mutex> lock(m_mutex);
                
                //两个线程同时调用getInstance方法同时进入,还是会创建两个实例
                if (instance == nullptr)
                {
                    instance = new Singleton;
                }
            }
            return instance;
        }
    
    private:
        //私有函数让其不能被构造,也不能拷贝
        Singleton() {};
        Singleton(const Singleton&) {};
        Singleton& operator = (const Singleton&) {};
    
        static Singleton *instance;
        static mutex m_mutex;
    };
    Singleton* Singleton::instance = nullptr;
    mutex Singleton::m_mutex;
    
    int main()
    {
        Singleton *single1 = Singleton::getInstance();
        Singleton *single2 = Singleton::getInstance();
        if (single1 == single2)
        {
            cout << "=" << endl;
        }
        return 0;
    }
    

    相关文章

      网友评论

          本文标题:线程安全的单例模式

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