C++ 单例模式

单例模式

  • 一个类仅有一个实例
  • 提供该实例的全局访问点

单线程下的单例模式:

cpp 复制代码
class Singleton{
public:
	static Singleton * GetInstance(){
		if(_instance == nullptr)
		{
			_instance = new Singleton();
			std::atexit(Destructor);
		}
		return _instance;
	}
private:
	static void Destructor(){
		if(_instance != nullptr){
			delete _instance;
			_instance = nullptr;
		}
	}
	Singleton() {}
	~Singleton() {}
	Singleton(const Singleton &clone) {}
	Singleton & operator=(const Singleton &) {};
	static Singleton *_instance;
};
Singleton *Singleton::_instance = nullptr;

1.静态成员函数和静成员变量

2.构造、析构、赋值操作符、拷贝构造私有化

3.new是堆上创建std::atexit

多线程下的单例模式:

cpp 复制代码
#include <mutex>
#include <atomic>
class Singleton{
public:
	static Singleton * GetInstance(){
		Singleton *temp = _instance.load(std::memory_order_relaxed);
		std::atomic_thread_fence(std::memory_order_acquire);//内存栅栏,确保在此点之前的所有读操作都完成,并且在此点之后的所有读操作都不会被重排到这个点之前
		//std::lock_guard<std::mutex> lock(_mutex);
		if(_instance == nullptr)
		{
			std::lock_guard<std::mutex> lock(_mutex);
			temp = _instance.load(std::memory_order_relaxed);
			if(_instance == nullptr)
			{
				temp = new Singleton();//多线程环境下编译器和cpu对程序进行优化
				std::atomic_thread_fence(std::memory_order_release);
				_instance.store(temp,std::memory_order_relaxed);
				//1.分配内存 2.调用构造函数 3.返回指针、赋值运算
				//优化为1、3、2
				std::atexit(Destructor);
			}		
		}
		return _instance;
	}
private:
	static void Destructor(){
		Singleton *temp = _instance.load(std::memory_order_relaxed);
		if(temp != nullptr){
			delete temp;
			_instance.store(temp,std::memory_order_relaxed);
			temp = nullptr;
		}
	}
	Singleton() {}
	~Singleton() {}
	Singleton(const Singleton &clone) {}
	Singleton & operator=(const Singleton &) {};
	static std::atomic<Singleton *> _instance;
	static std::mutex _mutex;
};
std::atomic<Singleton *> Singleton::_instance = nullptr;
std::mutex Singleton::_mutex;

1.两次判断,希望在第二次判断的时候加互斥锁

2.多线程环境下,编译器、cpu的优化(指令重排)------原子操作+内存屏障


获取更多Linux C/C++资料

相关推荐
水木流年追梦17 分钟前
大模型入门-应用篇3-Agent智能体
开发语言·python·算法·leetcode·正则表达式
凯瑟琳.奥古斯特23 分钟前
假脱机技术原理详解
开发语言·职场和发展
君义_noip32 分钟前
CSP-S 2025 入门级 第一轮(初赛) 完善程序(1)
c++·算法·信息学奥赛·初赛·csp 第一轮
敲代码的瓦龙1 小时前
Java?枚举!!!
java·开发语言
NiceCloud喜云1 小时前
IntelliJ IDEA 保姆级安装 + ClaudeAPI 配置教程
java·开发语言·前端·ide·chrome·docker·intellij-idea
3D探路人2 小时前
模灵 大模型聚合API 转发流程技术实现
java·大数据·开发语言·前端·人工智能·计算机视觉
蜡笔小马2 小时前
07.C++设计模式-组合模式
c++·设计模式·组合模式
l1t2 小时前
JIT执行python脚本的工具codon安装和测试
开发语言·python
liulilittle2 小时前
TCP UCP v1.0:BBR 的非破坏性约束层
网络·c++·网络协议·tcp/ip·算法·c·通信
程似锦吖2 小时前
无中生有 之 从0开始写一个动态定时任务管理
java·开发语言