讲师中心 微信公众号
AI工具推荐 视频效率加速

C++如何编写线程安全的Singleton _ 饿汉式与内部静态变量【实战】

陌萱小哥_8119

陌萱小哥_8119

发布时间:2026-04-11 17:18:36

|

667人浏览过

|

来源于php中文网

原创

饿汉式天然线程安全,因其实例在main()前由启动代码单线程初始化;内部静态变量靠C++11对static局部变量初始化的原子性保障,首次调用时线程安全延迟构造。

c++如何编写线程安全的singleton _ 饿汉式与内部静态变量【实战】

饿汉式和内部静态变量写法都能做到线程安全,但根本原因不同:前者靠编译器保证全局静态初始化的单线程时机,后者靠 C++11 标准对 static 局部变量初始化的原子性保障。别混用、别手写锁,否则反而引入 bug。

饿汉式为什么天然线程安全

饿汉式把实例声明为全局或类内 static 指针/对象,在 main() 执行前就完成构造。这个过程由启动代码(如 __libc_start_main)以单线程方式驱动,不存在竞态窗口。

  • 必须在类外定义并初始化指针:Singleton* Singleton::instance = new Singleton();,否则链接时报 undefined reference to 'Singleton::instance'
  • 如果用 static Singleton instance; 做类内静态成员,仍需类外定义(C++98/03 要求),C++17 可用 inline static 省去定义步骤
  • 析构不可控:new 出来的对象不会自动调用 delete,得手动加 DestroyInstance(),且要确保调用时机——比如在 atexit() 里注册,否则可能在静态对象析构阶段访问已销毁资源

内部静态变量写法(C++11+ 推荐)

这是目前最干净的懒汉语义实现:首次调用 getInstance() 时才构造,且由编译器生成的 guard 变量 + pthread_once 或等效机制保证初始化仅执行一次、线程安全。

  • 写法必须是函数作用域内的 static Singleton instance;,不能是类内 static 成员,否则失去延迟性和标准保障
  • 返回引用即可:return instance;;若返回指针,得写 return &instance;,注意生命周期完全由函数首次调用绑定
  • 不要在该函数里加 std::mutex 或 std::call_once —— 编译器已经做了,加了反而多此一举,还可能死锁(比如在动态库加载期调用)
  • 该实例会在程序退出时按逆序析构(与首次调用所在线程无关),无需手动管理内存

常见错误:误把“静态局部变量”当“类内静态成员”

下面这段代码看起来像内部静态变量,实则无效:

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载

立即学习“C++免费学习笔记(深入)”;

class Singleton {
public:
    static Singleton& getInstance() {
        static Singleton instance; // ✅ 正确:函数内 static
        return instance;
    }
private:
    Singleton() = default;
    static Singleton instance; // ❌ 错误:这是类内 static 成员,未定义会链接失败
};

更隐蔽的坑是:在头文件里定义了 static Singleton instance;,多个 .cpp 包含该头文件 → ODR 违反,链接时出现多重定义或未定义符号。

性能与适用场景怎么选

饿汉式适合初始化开销小、且确定会被用到的场景(比如日志器、配置解析器);内部静态变量适合初始化重、使用频率低或依赖运行时参数的单例(比如连接池、硬件设备句柄)。

  • 饿汉式启动慢一点,但后续零开销;内部静态变量首次调用有微小延迟(含 guard 检查 + 构造),之后无锁无检查
  • 若单例构造函数抛异常,饿汉式会导致程序直接终止(静态初始化异常未捕获);内部静态变量抛异常后,下次调用仍会重试初始化 —— 这点要小心,可能掩盖逻辑错误
  • 跨动态库边界时,饿汉式各库独立初始化一份实例;内部静态变量按 TU(translation unit)隔离,同一 TU 内唯一,但不同 .so/.dll 之间不共享

真正容易被忽略的是异常安全性与跨库行为——这两点几乎从不出现在示例代码里,但上线后一出问题就是 core dump 或静默错乱。

热门AI工具

更多
咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

相关专题

更多
C++ 智能指针与现代内存管理
C++ 智能指针与现代内存管理

深入讲解 C++ 现代内存管理的核心工具——智能指针,涵盖 unique_ptr 独占所有权语义、shared_ptr 引用计数机制与循环引用问题、weak_ptr 弱引用的应用场景、make_unique/make_shared 工厂函数的性能优势、自定义删除器的编写、RAII 资源管理思想的实践,以及从裸指针迁移到智能指针的重构策略,帮助开发者编写安全无泄漏的现代 C++ 代码。

359

2026.04.23

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

4178

2023.08.10

数据库Delete用法
数据库Delete用法

数据库Delete用法:1、删除单条记录;2、删除多条记录;3、删除所有记录;4、删除特定条件的记录。更多关于数据库Delete的内容,大家可以访问下面的文章。

2991

2023.11.13

drop和delete的区别
drop和delete的区别

drop和delete的区别:1、功能与用途;2、操作对象;3、可逆性;4、空间释放;5、执行速度与效率;6、与其他命令的交互;7、影响的持久性;8、语法和执行;9、触发器与约束;10、事务处理。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

925

2023.12.29

undefined是什么
undefined是什么

undefined是代表一个值或变量不存在或未定义的状态。它可以作为默认值来判断一个变量是否已经被赋值,也可以用于设置默认参数值。尽管在不同的编程语言中,undefined可能具有不同的含义和用法,但理解undefined的概念可以帮助我们更好地理解和编写程序。本专题为大家提供undefined相关的各种文章、以及下载和课程。

11705

2023.07.31

网页undefined是什么意思
网页undefined是什么意思

网页undefined是指页面出现了未知错误的意思,提示undefined一般是在开发网站的时候定义不正确或是转换不正确,或是找不到定义才会提示undefined未定义这个错误。想了解更多的相关内容,可以阅读本专题下面的文章。

5507

2024.08.14

网页undefined啥意思
网页undefined啥意思

本专题整合了undefined相关内容,阅读下面的文章了解更多详细内容。后续继续更新。

2516

2025.12.25

OpenJDK JVM参数怎么调优
OpenJDK JVM参数怎么调优

Java应用运行缓慢,如何调整JVM参数?本专题介绍OpenJDK JVM性能调优的基本流程,涵盖性能指标确认、运行数据采集、内存配置和垃圾回收分析,帮助你先定位瓶颈,再通过对照测试验证效果,避免直接套用参数而影响应用稳定性。

60

2026.10.16

OpenJDK怎么配置Java开发环境
OpenJDK怎么配置Java开发环境

怎样用OpenJDK搭建开发环境?本专题介绍版本选择、下载安装、环境变量配置和编译运行验证,帮助你理清JDK的作用及基本配置流程,并通过简单程序检查环境是否可用,为后续项目开发做好准备。

40

2026.10.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn