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

2019-04-02  本文已影响0人  Jozhn

完美的单例模式是线程安全的,使用懒汉模式。
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;
}

上一篇 下一篇

猜你喜欢

热点阅读