当前位置: 首页 > 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;

相关文章:

  • GAN-STD:融合检测器与生成器的方法
  • 解决Visual Studio报“IntelliSense不可用,需设置TRACEDESIGNTIME = true“问题
  • 热编码(One-Hot Encoding)
  • Volatile的相关内容
  • 【MySQL系列】数据库死锁问题
  • mysql 导入导出数据
  • 人工智能概论(一)初见人工智能笔记
  • 分布式消息中间件设计与实现
  • ELF文件的作用详解
  • 互联网大厂Java求职面试:AI与大模型应用集成中的架构难题与解决方案
  • react 脚手架
  • STM32八股【10】-----stm32启动流程
  • 【Linux】磁盘空间不足
  • BTC官网关注巨鲸12亿美元平仓,XBIT去中心化交易平台表现稳定
  • github项目:llm-guard
  • SpringCloud实战:Seata分布式事务整合指南
  • Github 今日热点 完全本地化的自主AI助手,无需API或云端依赖
  • Linux进程通信之管道机制全面解析
  • NV149NV153美光固态闪存NV158NV161
  • Linux系统克隆
  • 物流建设网站/网络推广软件哪个好
  • 旅行社建设网站/seo是什么平台
  • 网站制作多少钱方案/百度推广后台登录首页
  • 建筑公司网站应该则么做/个人如何做网络推广
  • 国外包装设计网站大全/seo排名优化什么意思
  • 哪些网站可以接单做/深圳市推广网站的公司