新闻中心
C++如何实现单例设计模式_C++中线程安全的懒汉与饿汉式单例
饿汉式在程序启动时创建实例,天然线程安全;2. 懒汉式在首次调用时初始化,C++11起局部静态变量实现线程安全且推荐使用;3. 旧标准可通过互斥锁和双重检查锁定实现线程安全;4. 智能指针可优化内存管理;5. 应删除拷贝构造与赋值操作以防止复制。

单例设计模式确保一个类只有一个实例,并提供全局访问点。在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配音
在线文字转语音软件-专业的配音网站
78
查看详情
传统加锁方式(适用于旧标准):
#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);
i
f (!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
基本上就这些。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版账号注册详细流程图文教程
微信网页版官方快速登录入口 微信网页版网页版账号直达


2025-12-08
浏览次数:次
返回列表
f (!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;