C++:线程安全的单例模式

/ C++ / 没有评论 / 1944浏览

单例模式有饿汉模式和懒汉模式,饿汉模式:因为将该单例对象定义为static变量,程序启动即将其构造完成了。懒汉模式:存在线程安全的问题,解决方案是Double-Checked Locking Pattern (DCLP)。使用两次判断来解决线程安全问题并且提高效率。

饿汉模式

class Singleton {
public:
  static Singleton* GetInstance() {
    return singleton_;
  }

  static void DestreyInstance() {
    if (singleton_ != NULL) {
      delete singleton_;
    }
  }

private:
  // 防止外部构造。
  Singleton() = default;

  // 防止拷贝和赋值。
  Singleton& operator=(const Singleton&) = delete;
  Singleton(const Singleton& singleton2) = delete;

private:
  static Singleton* singleton_;
};

Singleton* Singleton::singleton_ = new Singleton;

//调用结束后要手动释放内存

懒汉模式

//在C++11环境下编译
class Singleton {
public:
  static Singleton& GetInstance() {
    static Singleton intance;
    return intance;
  }

  ~Singleton() = default;

private:
  Singleton() = default;

  Singleton(const Singleton&) = delete;
  Singleton& operator=(const Singleton&) = delete;
};

局部静态变量可以延迟对象的构造,等到第一次调用时才进行构造,C++11中静态变量的初始化时线程安全的 。

还有别的方式比如实现,需要手动释放内存的,就用智能指针实现,加锁+两次判空在new的时候,有可能还没完成赋值。这时候解决办法可以用临时的变量去构造,然后在赋值给instance变量。或者使用std::call_once。

参考链接:线程安全的单例模式