单例模式两种实现方法

设计模式

单例模式:

复制代码
#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;
相关推荐
syagain_zsx6 小时前
算法基础篇 · 03 枚举(C++ 题解)
c++·算法·二进制·枚举
weixin_307779136 小时前
C++代码实现MATLAB中的ode23tb函数功能
开发语言·c++·算法·matlab
2601_966949656 小时前
为什么量化回测中 for 循环比 DataFrame 慢三个数量级?从向量化原理讲起
开发语言·python·pandas·股票数据·quantdash
S_WEAN7 小时前
C++STL - string类的模拟实现
c++
S_WEAN7 小时前
【C++】STL - string类
c++
码匠许师傅7 小时前
【C++三方组件】toml++:人性化的配置文件格式
c++
边境悍匪8 小时前
蜗牛学苑 Java 智能体学习 Day45|Knife4j+SpringBoot3、书城项目整合 MyBatis 思维导图复盘
java·开发语言·vue.js·学习·spring
我的xiaodoujiao8 小时前
Django 基础知识详细图文教程 9-Django 模板引擎 2
开发语言·数据库·后端·django
菜鸟~noob2338 小时前
【太空电子战】从CCS到Meadowlands:反通信系统的二十年演进史【含matlab代码】
开发语言·matlab