新闻中心

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

2025-12-08
浏览次数:
返回列表
饿汉式在程序启动时创建实例,天然线程安全;2. 懒汉式在首次调用时初始化,C++11起局部静态变量实现线程安全且推荐使用;3. 旧标准可通过互斥锁和双重检查锁定实现线程安全;4. 智能指针可优化内存管理;5. 应删除拷贝构造与赋值操作以防止复制。

c++如何实现单例设计模式_c++中线程安全的懒汉与饿汉式单例

单例设计模式确保一个类只有一个实例,并提供全局访问点。在C++中,常见的实现方式有“饿汉式”和“懒汉式”,两者在初始化时机和线程安全性上有所不同。下面分别介绍线程安全的实现方法。

饿汉式单例(线程安全)

饿汉式在程序启动时就创建实例,由于静态变量在程序加载时完成初始化,因此天然线程安全。

优点是无需考虑多线程竞争;缺点是可能提前占用资源,即使从未使用该实例。

示例代码:

class Singleton {
private:
    static Singleton instance; // 静态成员,在程序启动时构造
    Singleton() {} // 私有构造函数
<p>public:
static Singleton& getInstance() {
return instance;
}</p><pre class="brush:php;toolbar:false;">Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&) = delete;

}; // 定义静态成员 Singleton Singleton::instance;

懒汉式单例(线程安全)

懒汉式延迟创建实例,直到第一次调用 getInstance() 时才初始化。在多线程环境下,必须保证初始化过程线程安全。

C++11 起,局部静态变量的初始化具有线程安全性,这是最简洁且推荐的方式。

示例代码(C++11 局部静态变量):

class Singleton {
private:
    Singleton() {}
<p>public:
static Singleton& getInstance() {
static Singleton instance; // C++11 起线程安全
return instance;
}</p><pre class="brush:php;toolbar:false;">Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&) = delete;

};

如果不能使用 C++11 或以上版本,可使用互斥锁(mutex)实现线程安全的懒加载。

标贝悦读AI配音 标贝悦读AI配音

在线文字转语音软件-专业的配音网站

标贝悦读AI配音 78 查看详情 标贝悦读AI配音 传统加锁方式(适用于旧标准):

#include <mutex>
<p>class Singleton {
private:
static Singleton* instance;
static std::mutex mtx;
Singleton() {}</p><p>public:
static Singleton* getInstance() {
if (instance == nullptr) { // 双重检查锁定减少锁开销
std::lock_guard<std::mutex> lock(mtx);
if (instance == nullptr) {
instance = new Singleton();
}
}
return instance;
}</p><pre class="brush:php;toolbar:false;">Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&) = delete;

};

// 静态成员定义 Singleton* Singleton::instance = nullptr; std::mutex Singleton::mtx;

智能指针优化懒汉式

为避免手动管理内存,可用智能指针结合锁机制自动释放资源。

#include <memory>
#include <mutex>
<p>class Singleton {
private:
static std::unique_ptr<Singleton> instance;
static std::mutex mtx;
Singleton() {}</p><p>public:
static Singleton* getInstance() {
std::lock_guard<std::mutex> lock(mtx);
if (!instance) {
instance = std::unique_ptr<Singleton>(new Singleton());
}
return instance.get();
}</p><pre class="brush:php;toolbar:false;">Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&) = delete;

};

std::unique_ptr Singleton::instance = nullptr; std::mutex Singleton::mtx;

基本上就这些。C++中实现线程安全的单例,优先使用局部静态变量(Meyers 单例),代码简洁且高效。若需更复杂的控制或兼容旧环境,再考虑加锁方案。不复杂但容易忽略细节,比如删除拷贝构造和赋值操作。

以上就是C++如何实现单例设计模式_C++中线程安全的懒汉与饿汉式单例的详细内容,更多请关注其它相关文章!


# c++  # 加载  # 如何使用  # 懒加载  # 见性  # 益阳抖音关键词热度排名  # 青岛小红书促销推广网站  # 铜陵网站优化模式哪家好  # 单元测试  # 这是  # 加锁  # 启动时  # 高性能  # 如何实现  # 多线程  # 南昌土地招租推广网站  # 湖南抖音seo加盟  # 团林网站建设技巧  # 岳阳市 网站建设  # 娄底工厂网站建设  # 注重网站推广的行业  # 全网营销实战培训seo顾问 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: 在命令行怎么运行html项目_命令行运行html项目方法【教程】  在Socket.IO连接中实现Access Token自动更新与动态重连  html怎么在cmd下运行php文件_cmd运行html中php文件方法【教程】  J*aScript中localStorage数据的获取、清洗与格式化教程  漫蛙漫画登录站点 漫蛙2正版漫画快速访问  《北京人工智能产业白皮书(2025)》发布:全年核心产值预计突破 4500 亿元  抖音极速版最新版本 抖音极速版官方下载地址  抖音网页版平台入口 抖音网页版官网在线访问教程  将JSON对象数组转置为键值对列表的实用指南  基于动态规划的房屋花卉种植最小成本算法详解  如何解决电商平台定制报价请求的“黑洞”问题,SprykerQuoteRequest模块助你提升客户体验与销售效率  快速CSGO开箱网站指南 CSGO开箱平台推荐  AI抖音网页版免费视频入口 AI抖音网页端最新视频实时观看  随机参数递归函数的基准调用次数与时间复杂度探究  Golang如何优化内存分配与垃圾回收_Golang内存管理与GC优化实践  12306选座如何查看座位示意图_12306座位示意图解读与使用  CSS Box Model与弹性按钮:维持布局稳定的动画实践  浏览器打开即用 美图秀秀网页版入口  中兴Axon42Ultra怎样在文件App筛图_iPhone中兴Axon42Ultra文件App筛图【图片筛选】  2025年云电脑操作系统体验 | 无需本地硬件,随时随地使用高性能PC  知乎APP怎么管理已购盐选内容_知乎APP盐选内容购买记录与查看方法  Web Components中自定义开关组件状态同步的常见陷阱与解决方案  sublime怎么格式化代码_sublime代码美化与一键排版插件配置  html网页设计源代码怎么运行_运行html网页设计源代码步骤【指南】  Lar*el Excel导入时生成自定义递增ID的策略与实践  Win11怎么合并任务栏图标 Win11开启任务栏合并减少图标占空间【方法】  163邮箱注册官网 免费申请163个人邮箱  Win11如何使用Windows Sandbox Win11沙盒功能开启与使用教程【详解】  mcjs网页版在线存档 mcjs云存档登录入口  支付宝碰一碰设备是REDMI手机吗 博主拆机辟谣:处理器、内存都不一样  解决Bootstrap卡片顶部边距导致背景图下移的问题  怎么在浏览器上运行HTML文件_浏览器运行HTML文件技巧【技巧】  使用J*aScript检测输入元素是否包含在特定类中  一加手机电池耗电快怎么办_一加手机电池耗电快的解决方法  批改网学生版PC登录 批改网官网登录系统入口  126邮箱网页版官方入口 126邮箱账号在线登录平台  Mac怎么使用表情符号_Mac Emoji快捷键面板  J*a递归快速排序中静态变量导致数据累积的陷阱与解决方案  XML中包含HTML标签导致解析错误? 正确嵌入非XML数据的两种方法  一加 14R 快充无反应_一加 14R 充电优化  Python实现多节点属性重叠度分析教程  如何使用Go和Martini动态服务解码后的图片  qq邮箱发邮件给国外发不出去_QQ邮箱国际邮件发送失败原因与解决  Composer如何在生产环境安全地执行composer update  电脑IP地址怎么查 查看本机IP地址的几种方法  必由学登录入口 必由学官方网站在线访问链接  C#如何安全地从用户上传的XML文件中读取数据? 验证与清理策略  J*a实现学校排课程序_面向对象结构化项目示例  荒野行动PC版怎么注册_荒野行动PC版账号注册详细流程图文教程  微信网页版官方快速登录入口 微信网页版网页版账号直达 

搜索