设计模式
单例模式:
#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;