当前位置: 首页 > article >正文

【QT】C++线程安全的单例模板

模板代码

#pragma once
#include <mutex>
#include <atomic>

// CRTP基类模板 Curiously Recurring Template Parttern—奇异递归模板模式。
template <typename T>
class SingletonCRTP {
public:
	// 禁止拷贝构造和赋值操作
	SingletonCRTP(const SingletonCRTP&) = delete;
	SingletonCRTP& operator=(const SingletonCRTP&) = delete;

	// 禁止移动构造和赋值操作
	SingletonCRTP(SingletonCRTP&&) = delete;
	SingletonCRTP& operator=(SingletonCRTP&&) = delete;

	// 获取单例实例
	static T* getInstance() {
		if (m_instance == nullptr) {
			std::unique_lock<std::mutex> lock(m_Mutex); // 加锁
			if (m_instance == nullptr) {
				T* temp = new (std::nothrow) T();
				if (temp == nullptr) {
					throw std::bad_alloc();
				}
				m_instance = temp;
			}
		}
		return m_instance;
	}

protected:
	SingletonCRTP() = default;
	~SingletonCRTP() {
		if (m_instance) {
			delete m_instance;
			m_instance = nullptr;
		}
	}
	// 静态成员变量定义
	static T* m_instance;
	static std::mutex m_Mutex;
};

// 静态成员变量的模板类特化
template <typename T>
T* SingletonCRTP<T>::m_instance = nullptr;

template <typename T>
std::mutex SingletonCRTP<T>::m_Mutex;

使用方式

#include "SingletonCRTP.h"
class Class1 : public SingletonCRTP<Class1>
{
    friend class SingletonCRTP<Class1>;
public:
    void DoDoDo() {
        printf("Hello World!");
    }

}
int main(int argc, char *argv[])
{
	Class1::getInstance()->DoDoDo();
}

http://www.kler.cn/a/469437.html

相关文章:

  • 微信小程序校园自助点餐系统实战:从设计到实现
  • 黄仁勋演讲总结(2种显卡,1个开源大模型,1个数据采集平台)
  • 性能测试01|性能测试理论
  • Flutter 鸿蒙化 flutter和鸿蒙next混和渲染
  • 【2025最新计算机毕业设计】基于SpringBoot+Vue智慧养老医护系统(高质量源码,提供文档,免费部署到本地)【提供源码+答辩PPT+文档+项目部署】
  • Unity 中计算射线和平面相交距离的原理
  • Docker容器中Elasticsearch内存不足问题排查与解决方案
  • 【车载网络】BUSOFF状态简述和制造
  • Go语言的 的输入/输出流(I/O Streams)核心知识
  • LeetCode:700.二叉搜索树中的搜索
  • ThreadLocal` 的工作原理
  • Apache zookeeper集群搭建
  • Java-数据结构-时间和空间复杂度
  • Python 标准库:hashlib——安全哈希与消息摘要
  • ARM CCA机密计算安全模型之加密建议
  • 26 go语言(golang) - GC原理
  • 系统架构师考试-MDA模型驱动架构
  • Mac 版本向日葵退出登录账号
  • Electron快速入门——跨平台桌面端应用开发框架
  • 嵌入式linux中socket控制与实现
  • Mono里运行C#脚本24—handle_ctor_call
  • 【Unity3D】UGUI Canvas画布渲染流程
  • 【NLP高频面题 - Transformer篇】Transformer编码器有哪些子层?
  • 【蓝桥杯】43709.机器人繁殖
  • (初学者)STM32 MP157中LED触发器笔记
  • Go小技巧易错点100例(二十一)