单例模式两种实现方法

设计模式

单例模式:

复制代码
#include <iostream>
#include<mutex>

class MyCAS {
private:
  MyCAS() {};
  MyCAS(const MyCAS*) = delete;
  MyCAS& operator=(const MyCAS*) = delete;
private:
  static MyCAS* m_instance;
  static std::mutex m_mutex;

public:

  static MyCAS* GetInstance() {
    if (m_instance == nullptr) {
      std::lock_guard<std::mutex> lock(m_mutex);
      if (m_instance == nullptr) {
        m_instance = new MyCAS();
        static CGarhuishou cl;
      }

    }
    return m_instance;
  };

  class CGarhuishou {
  public:
    ~CGarhuishou() {
      if (MyCAS::m_instance) {
        delete MyCAS::m_instance;
        MyCAS::m_instance = nullptr;
      }
    }
  };
  void func() {
    std::cout << "测试" << std::endl;
  }
};
MyCAS* MyCAS::m_instance = nullptr;
std::mutex MyCAS::m_mutex;

使用std::once_flag ,作为一个标记,std::call_once通过这个标记来决定对应传入的函数是否执行,调用call_once成功后,call_once会反转这个标记,这样再次调用这个call_once后,传入的函数就不会再次被执行了;

复制代码
#include <iostream>
#include<mutex>

class MyCAS {
private:
  MyCAS() {};
  MyCAS(const MyCAS*) = delete;
  MyCAS& operator=(const MyCAS*) = delete;
private:
  static MyCAS* m_instance;

  static std::once_flag m_flag;
public:
  static void CreateInstance() {
    m_instance = new MyCAS();
    static CGarhuishou cl;
  }
  static MyCAS* GetInstance() {

    std::call_once(m_flag, CreateInstance);

    return m_instance;
  };

  class CGarhuishou {
  public:
    ~CGarhuishou() {
      if (MyCAS::m_instance) {
        delete MyCAS::m_instance;
        MyCAS::m_instance = nullptr;
      }
    }
  };
  void func() {
    std::cout << "测试" << std::endl;
  }
};
MyCAS* MyCAS::m_instance = nullptr;

std::once_flag MyCAS::m_flag;
相关推荐
见过夏天14 小时前
C++ 基础入门完全指南
c++
用户805533698032 天前
不止三件套:QObject 属性系统全关键字与运行时反射!
c++·qt
BadBadBad__AK2 天前
线段树维护区间 k 次方和
c++·数学·算法·stl
卷无止境3 天前
Eigen 库如何借助 OpenMP 加速计算
c++·后端
卷无止境3 天前
OpenMPI、MPICH 与 OpenMP:关系、核心概念与架构全解
c++·后端
郝学胜_神的一滴4 天前
CMake 30:循环语法全解|foreach_while双循环精讲、迭代技巧与实战避坑指南
c++·cmake
卷无止境6 天前
C++ 的Eigen 库全解析
c++
卷无止境6 天前
现代 C++特性大盘点:一门脱胎换骨的老语言
c++·后端
郝学胜_神的一滴6 天前
CMake 27:缓存变量的特性、语法、类型与实操全解
c++·cmake
博客18008 天前
酷宝的使用方法,超好用的免费界面库,C++、MFC可用
c++·mfc·界面库·库来帮·酷宝