C++单例(线程安全)

  1. 通过call_once包装的饿汉模式(建议使用)


#include 

class Singleton
{
public:
    static Singleton* getInstance()
    {
        std::call_once(initInstanceFlag, [&](){ instance = new Singleton(); });
        return instance;
    }
private:
    Singleton() = default;
    ~Singleton() = default;
    Singleton(const Singleton &) = delete;
    Singleton &operator=(const Singleton &) = delete;

    static Singleton *instance;
    static std::once_flag initInstanceFlag;
};

Singleton *Singleton::instance = nullptr;
std::once_flag Singleton::initInstanceFlag;
  1. 饱汉(懒汉)模式 (线程安全, 但缺点是:会占用程序启动的时间,不太符合即用即定义)


class Singleton {
public:
    static Singleton* getInstance() {
        return instance;
    }
private:
    static Singleton* instance;
    Singleton() = default;
    ~Singleton() = default;
    Singleton(const Singleton&) = delete;
    Singleton& operator=(const Singleton&) = delete;
};

Singleton* Singleton::instance = new Singleton();

  1. Meyers Singleton:这种模式其实并不能真正做到线程安全,因为调用构造函数时可能会出现线程切换,虽然只会有一个static对象,但C++构造函数并不是线程安全的

你可能感兴趣的:(c,c++,单例模式)