全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

C++如何实现单例模式_C++设计模式之线程安全的懒汉与饿汉单例

单例模式确保类唯一实例,C++中分饿汉(程序启动时创建,线程安全)和懒汉模式;推荐C++11局部静态变量实现懒汉,线程安全且延迟加载,避免手动加锁。

单例模式是一种常用的设计模式,确保一个类只有一个实例,并提供全局访问点。在C++中实现单例时,常分为“饿汉模式”和“懒汉模式”,两者的区别在于对象创建的时机。同时,在多线程环境下,必须考虑线程安全问题。

饿汉模式:提前创建,天然线程安全

饿汉模式在程序启动时就创建实例,由于对象在main函数运行前完成初始化,因此不存在多线程竞争问题,天然线程安全。

实现方式通常使用静态成员变量,在类外定义并初始化:

class Singleton { private: static Singleton instance; // 静态实例 Singleton() {} // 私有构造 public: static Singleton& getInstance() { return instance; } Singleton(const Singleton&) = delete; Singleton& operator=(const Singleton&) = delete; };

// 类外定义实例(程序启动时构造) Singleton Singleton::instance;

优点是简单、安全、无延迟;缺点是不管是否使用都会创建,可能浪费资源。

懒汉模式:延迟创建,需处理线程安全

懒汉模式在第一次调用getInstance时才创建实例,实现延迟加载。但在多线程环境中,多个线程可能同时进入创建逻辑,导致多次构造。

C++11以后,推荐使用局部静态变量的特性来实现线程安全的懒汉模式:

class Singleton { private: Singleton() {} public: static Singleton& getInstance() { static Singleton instance; // C++11保证线程安全 return instance; } Singleton(const Singleton&) = delete; Singleton& operator=(const Singleton&) = delete; };

C++11标准规定:局部静态变量的初始化是线程安全的,首次调用getInstance时才构造,且只构造一次。这是最简洁且安全的懒汉实现。

手动加锁的懒汉模式(不推荐)

在不支持C++11或需要更复杂控制时,可使用互斥锁实现线程安全的懒汉模式:

#include

class Singleton { private: static Singleton instance; static std::mutex mtx; Singleton() {} public: static Singleton getInstance() { if (instance == nullptr) { std::lock_guard<:mutex> lock(mtx); if (instance == nullptr) { instance = new Singleton(); } } return instance; } ~Singleton() {} Singleton(const Singleton&) = delete; Singleton& operator=(const Singleton&) = delete; };

// 类外定义 Singleton* Singleton::instance = nullptr; std::mutex Singleton::mtx;

注意双重检查锁定(Double-Checked Locking)需配合原子操作或内存屏障才能完全安全,否则仍有风险。因此优先推荐C++11的局部静态方式。

总结与建议

在现代C++中:

  • 优先使用局部静态变量实现懒汉单例,代码简洁且线程安全。
  • 若要求程序启动时就必须初始化,可选择饿汉模式。
  • 避免手动加锁+双重检查,除非有特殊需求且理解底层细节。

基本上就这些,不复杂但容易忽略细节。正确使用语言特性,比手动实现更可靠。


# c++  # ai  # 区别  # 延迟加载  # Static  # if  # 成员变量  # include  # const  # double  # class  # public  # private  # operator  # 线程  # 多线程  # delete  # 对象  # 启动时  # 加锁  # 中分  # 时才  # 这是  # 加载  # 是一种  # 首次  # 多个 


相关文章: 韩国服务器如何优化跨境访问实现高效连接?  云南网站制作公司有哪些,云南最好的招聘网站是哪个?  如何选择最佳自助建站系统?快速指南解析优劣  建站之星后台密码如何安全设置与找回?  如何彻底卸载建站之星软件?  ,购物网站怎么盈利呢?  如何快速搭建响应式可视化网站?  建站主机选购指南:核心配置与性价比推荐解析  如何用已有域名快速搭建网站?  如何快速登录WAP自助建站平台?  如何在阿里云虚拟机上搭建网站?步骤解析与避坑指南  武清网站制作公司,天津武清个人营业执照注销查询系统网站?  SQL查询语句优化的实用方法总结  如何在阿里云购买域名并搭建网站?  建站之星会员如何解锁更多建站功能?  如何用好域名打造高点击率的自主建站?  宁波免费建站如何选择可靠模板与平台?  打鱼网站制作软件,波克捕鱼官方号怎么注册?  想学网站制作怎么学,建立一个网站要花费多少?  建站主机选虚拟主机还是云服务器更好?  手机网站制作平台,手机靓号代理商怎么制作属于自己的手机靓号网站?  ,柠檬视频怎样兑换vip?  如何快速搭建高效可靠的建站解决方案?  广东专业制作网站有哪些,广东省能源集团有限公司官网?  临沂网站制作企业,临沂第三中学官方网站?  制作国外网站的软件,国外有哪些比较优质的网站推荐?  Android使用GridView实现日历的简单功能  常州企业建站如何选择最佳模板?  深圳网站制作公司好吗,在深圳找工作哪个网站最好啊?  香港服务器如何优化才能显著提升网站加载速度?  官网网站制作腾讯审核要多久,联想路由器newifi官网  如何零基础开发自助建站系统?完整教程解析  如何通过免费商城建站系统源码自定义网站主题与功能?  PHP 500报错的快速解决方法  mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?  小建面朝正北,A点实际方位是否存在偏差?  如何用低价快速搭建高质量网站?  实例解析angularjs的filter过滤器  如何通过西部建站助手安装IIS服务器?  制作假网页,招聘网的薪资待遇,会有靠谱的吗?一面试又各种折扣?  网站建设设计制作营销公司南阳,如何策划设计和建设网站?  GML (Geography Markup Language)是什么,它如何用XML来表示地理空间信息?  如何用5美元大硬盘VPS安全高效搭建个人网站?  如何用VPS主机快速搭建个人网站?  如何将凡科建站内容保存为本地文件?  如何在万网自助建站中设置域名及备案?  简易网站制作视频教程,使用记事本编写一个简单的网页html文件?  网站规划与制作是什么,电子商务网站系统规划的内容及步骤是什么?  成都网站制作报价公司,成都工业用气开户费用?  ui设计制作网站有哪些,手机UI设计网址吗? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。