美文网首页
C++简洁完美的单例模式实现

C++简洁完美的单例模式实现

作者: Jozhn | 来源:发表于2019-04-02 21:11 被阅读0次

    完美的单例模式是线程安全的,使用懒汉模式。
    Lock类用于加锁解锁,Singleton类为单例类。
    不过还可能出现问题,因为CPU可能乱序执行,会出现未定义行为导致段错误:
    假如线程A进入锁内并分配对象的空间,但是由于指令可能乱序,实际上导致local_instance被先指向一块未被分配的内存,然后再在这块内存上进程初始化。但是在指向后,未初始化前,另一线程B可能通过getInstance获取到这个指针。

    #include <iostream>
    #include <mutex>
    
    using namespace std;
    
    class Lock
    {
        private:
            mutex mtx;
        public:
            void lock(){mtx.lock();}
            void unlock(){mtx.unlock();}
    };
    
    class Singleton
    {
        private:
            Singleton(){};
            static Lock* locker;//静态锁对象指针
            static Singleton* instance;//静态单例对象指针
        public:
            static Singleton* getInstance()
            {
                if(!instance)
                {
                    locker->lock();
                    if(!instance)
                    {
                        instance = new Singleton;
                    }
                    locker->unlock();
                }
                return instance;
            };
    };
    
    // 初始化锁
    Lock* Singleton::locker = new Lock();
    // 初始化单例
    Singleton* Singleton::instance = 0;
    
    int main()
    {
        Singleton *s1 = Singleton::getInstance();
        Singleton *s2 = Singleton::getInstance();
        cout << s1 << endl;
        cout << s2 << endl;
    
        return 0;
    }
    
    

    相关文章

      网友评论

          本文标题:C++简洁完美的单例模式实现

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