新闻中心

C++如何实现单例模式_C++设计模式之线程安全的单例写法

2025-12-01
浏览次数:
返回列表
单例模式确保类唯一实例并提供全局访问点,C++中推荐使用局部静态变量实现线程安全单例,因C++11保证其初始化线程安全,无需加锁,简洁高效;也可用std::call_once控制初始化时机,适合复杂场景;双检锁模式虽存在但易出错,需谨慎;结合智能指针可自动管理资源。优先选择局部静态变量方式。

c++如何实现单例模式_c++设计模式之线程安全的单例写法

单例模式确保一个类只有一个实例,并提供全局访问点。在C++中实现线程安全的单例,关键在于避免多线程环境下重复创建实例。

使用局部静态变量(C++11 起线程安全)

C++11 标准规定:函数内的局部静态变量初始化是线程安全的。利用这一点,可以写出简洁且线程安全的单例。

代码示例:

class Singleton {
public:
    static Singleton& getInstance() {
        static Singleton instance; // 局部静态变量,首次调用时构造
        return instance;
    }
<pre class="brush:php;toolbar:false;">Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&) = delete;

private: Singleton() = default; // 私有构造函数 ~Singleton() = default; };

这种方式无需手动加锁,编译器保证初始化过程的线程安全,推荐使用。

使用 std::call\_once 和 std::once\_flag

如果需要更精细控制初始化时机,可使用 std::call_once 确保某段代码只执行一次。

#include <mutex>
<p>class Singleton {
public:
static Singleton& getInstance() {
std::call_once(initFlag, &Singleton::init);
return *instance;
}</p><p>private:
Singleton() = default;
static void init() {
instance = new Singleton();
}</p><pre class="brush:php;toolbar:false;">static std::once_flag initFlag;
static Singleton* instance;

};

std::once_flag Singleton::initFlag; Singleton* Singleton::instance = nullptr;

此方法明确表达“只初始化一次”的意图,适合复杂初始化逻辑。

网易人工智能 网易人工智能

网易数帆多媒体智能生产力平台

网易人工智能 233 查看详情 网易人工智能

双检锁模式(DCLP)需谨慎使用

早期常用双检锁避免每次加锁开销,但容易出错,尤其在旧C++标准下。

#include <mutex>
<p>class Singleton {
public:
static Singleton* getInstance() {
if (instance == nullptr) { // 第一次检查
std::lock<em>guard<std::mutex> lock(mutex</em>);
if (instance == nullptr) { // 第二次检查
instance = new Singleton();
}
}
return instance;
}</p><p>private:
Singleton() = default;
static Singleton* instance;
static std::mutex mutex_;
};

在 C++11 及以后,配合内存序(如 std::atomicmemory_order)可安全实现,但代码复杂,不推荐新手使用。

RAII 自动释放资源(可选)

为避免手动管理内存,可用智能指针结合局部静态变量或 std::call_once

例如,在 getInstance() 中返回 std::unique_ptr<singleton></singleton> 的引用,或依赖程序退出时自动析构。

基本上就这些。优先使用局部静态变量写法,简洁、安全、高效。其他方式了解即可,特殊需求再考虑。

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


# 相关文章  # 珠海网站策划推广  # 黄山全网营销推广公司  # 三门峡市网站seo优化排名  # 安次抖音seo  # 资阳市网站推广  # 濮阳seo优化哪里好  # email营销推广进度安排  # 微博怎么添加seo  # 重庆网站建设过程报告  # 合肥网站建设的保障体系  # ai  # 数独  # 首次  # 需谨慎  # 如何用  # 推荐使用  # 加锁  # 多线程  # 如何实现  # 网易  # c++ 


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


相关推荐: FullCalendar 自定义按钮样式定制指南  怎样更改Windows系统的默认安装路径_避免C盘爆满的终极设置【技巧】  Win11怎么开启高性能模式_Windows 11电源计划优化设置  sublime怎么覆盖插件的默认快捷键_sublime快捷键优先级与设置  ACG动漫视频网入口 ACG动漫*免费正版观看地址  Composer的 "licenses" 命令如何帮助你遵守开源协议_检查项目依赖的许可证合规性  在Socket.IO连接中实现Access Token自动更新与动态重连  XML中包含HTML标签导致解析错误? 正确嵌入非XML数据的两种方法  必由学官网首页入口 必由学教师网页版登录指南  如何创建没有密码的Windows本地账户_跳过微软账户登录的技巧【教程】  BetterDiscord插件中安全更新用户简介的实践指南  Linux如何排查内存不足OOME问题_LinuxOOM分析教程  c++如何实现一个简单的软件渲染器_c++从零开始的3D图形学  QQ邮箱登录平台入口 QQ邮箱网页版邮箱官方入口  Mac怎么使用表情符号_Mac Emoji快捷键面板  我的世界官方游戏入口 我的世界官网平台直达链接  J*aScript对象创建方式_J*aScript设计模式应用  虫虫漫画精品漫画官网_虫虫漫画精品漫画官网进入精品漫画  mc.js游戏直达 mc.js网页免下载版本秒进地址  poki网页游戏推荐_poki免费游戏平台入口  漫蛙2漫画入口 漫蛙正版网页漫画直达网址  高德地图沿途添加点失败如何解决 高德多点规划方法  c++如何使用Meson构建系统_c++比CMake更快的构建工具  QQ邮箱官方邮箱登录入口 QQ邮箱网页版快速访问  如何使用Go和Martini动态服务解码后的图片  AO3访问入口汇总 AO3网页版同人作品一键直达  UE5.7引擎表现爆炸优化无敌!5090跑4K稳定60FPS  qq游戏手机版下载安装_qq游戏移动端入口  163邮箱网页版入口导航平台 163邮箱网页版登录入口官网导航  CSS如何设置hover状态颜色_hover伪类调整背景或文字颜色  vivo云服务网页版登录 怎么登录vivo云服务网页版  微博网页版怎么开启两步验证_微博网页版账号安全两步验证设置方法  网站内容防复制粘贴的实现策略与局限性  不会效仿卡普空!《铁拳》制作人澄清:不采取赛事付费|直播|  腾讯QQ邮箱官方网站_QQ邮箱网页版在线登录  J*aScript DOM操作:高效清空列表元素的策略与实践  PS5 Pro有点优势但不多! 《燕云十六声》PS5平台与PC性能画面对比  Fabric Mod开发:在1.19.3+版本中正确添加自定义物品并管理物品组  J*aScript map 迭代中检测空数组元素的有效方法  如何在更新Composer依赖后自动运行测试_使用post-update-cmd钩子触发PHPUnit  Lar*el头像管理:图片缩放与旧文件删除的最佳实践  R星幕后开发视频泄露 包含《GTA6》等多款大作  没有大陆身份证/银行卡如何实名微信? 亲测有效的几种方法分享  Pandas DataFrame 高效批量赋值:告别循环与笛卡尔积误区  押井守高度称赞《辐射4》:玩了八年都停不下来!  基于动态规划的房屋花卉种植最小成本算法详解  在J*a中如何捕获IndexOutOfBoundsException_索引越界异常防护方法说明  小米汽车11月交付量突破40000台!雷军:将继续努力  Lar*el表单中优雅地处理“返回”按钮以规避验证:最佳实践指南  在Go语言中利用后缀数组处理多字符串:实现高效文本匹配与自动补全 

搜索