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

C++单例模式与线程安全

C++单例模式的线程安全实践与优化-CSDN博客

https://www.zhihu.com/question/56527586/answer/2344903391

C++11中的单例模式

在C++11及更高版本中,可以使用std::call_oncestd::once_flag来确保单例实例的线程安全初始化。这种方法不需要显式地使用互斥锁,因为std::call_once会自动处理。

class Singleton {
private:
static std::unique_ptr<Singleton> instance;
static std::once_flag onceFlag;
Singleton() {}public:
static Singleton* getInstance() {
std::call_once(onceFlag, [] {
instance.reset(new Singleton());
});
return instance.get();
}
};std::unique_ptr<Singleton> Singleton::instance;
std::once_flag Singleton::onceFlag;

在实现单例模式时,需要考虑到线程安全、资源管理和程序的启动时间。选择合适的单例实现方法,可以根据具体的应用场景和需求来决定。在多线程环境中,确保线程安全是实现单例模式时的一个重要考虑因素。C++11提供的std::call_once是一个很好的工具,可以帮助简化线程安全的单例实现。

饿汉式单例

饿汉式单例在程序启动时就立即初始化。由于在程序启动时就完成了初始化,因此它是线程安全的。但是,这种方法的缺点是不管你最终是否使用这个实例,它都会被创建,可能会导致资源的浪费。

class Singleton {
private:
static Singleton* instance;
Singleton() {}public:
static Singleton* getInstance() {
return instance;
}
};Singleton* Singleton::instance = new Singleton();

class Singleton {public :static volatile Singleton* GetInstance(int x = 0) {if (instance_ == NULL) {std::lock_guard<std::mutex> lock(mtx);if (instance_ == NULL) {volatile Singleton* temp = new volatile Singleton(x);instance_ = temp;}}return instance_;}void Print() { std::cout << this->member_ << std::endl;}private:Singleton(int x = 3) : member_(x) {}int member_;static volatile Singleton* instance_;  //declare a static member variable    
};volatile Singleton* Singleton::instance_ = NULL;  //define a static member variable

懒汉式单例

懒汉式单例是指在第一次被引用时,才进行实例的初始化。这种方法的优点是延迟了实例的创建,因此在启动时不会增加额外的负载。但是,这种方法在多线程环境下需要特别注意线程安全问题。

class Singleton {
private:
static Singleton* instance;
Singleton() {}
Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&) = delete;public:
static Singleton* getInstance() {
if (instance == nullptr) {
instance = new Singleton();
}
return instance;
}
};Singleton* Singleton::instance = nullptr;

http://www.xdnf.cn/news/633007.html

相关文章:

  • webpack面试问题
  • 理解HTTP基本认证与表单登录认证
  • 自动化安全脚本学习
  • 9:OpenCV—模板匹配
  • React声明式编程(手动控制,大型项目,深度定制)与Vue响应式系统(自动优化,中小型项目,快速开发)区别
  • openjdk底层(hotspot)汇编指令的内存分布
  • 掌阅iReader新形态墨水屏Tango发布:科技与美学共舞,开启灵动阅读新体验
  • C++星际密码破译全国信息素养大赛复赛决赛 C++小学/初中组 算法创意实践挑战赛 内部集训模拟题详细解析
  • SAR ADC的功耗设计
  • 图解BERT
  • 免费开源 PDF 阅读器 自带虚拟打印机功能 多格式兼容
  • 【计算机网络】基于UDP进行socket编程——实现服务端与客户端业务
  • threejs模型对象、材质
  • 健身网l;l;j
  • Java21 并发处理说明
  • Python数据可视化实战:让数据从「数字堆」变成「故事书」
  • git push出现 “HTTP 400 curl 22 The requested URL returned error: 400...“错误
  • 计网5:HTTP/TCP的长连接和短连接的区别以及各自的应用场景
  • JavaSE核心知识点03高级特性
  • Linux系统之----磁盘硬件
  • 【25软考网工】第八章 (1)交换机基础
  • C# 预处理器指令
  • 人工智能概论(一)初见人工智能笔记
  • MultipartFile实现文件上传
  • python 程序实现了毫米波大规模MIMO系统中的信道估计对比实验
  • 基于CEEMDAN-Transformer-BiLSTM的多特征风速气候预测的完整实现方案及PyTorch源码解析
  • 2025年渗透测试面试题总结-匿名[实习]安全工程师(大厂) (2)(题目+回答)
  • 大数据与数据分析【数据分析全栈攻略:爬虫+处理+可视化+报告】
  • Github上一些使用技巧(缩写、Issue的Highlight)自用
  • Ollama-OCR:基于Ollama多模态大模型的端到端文档解析和处理