首页 > 后端开发 > C++ > 正文

C++单例模式实现 线程安全双重检查锁

P粉602998670
发布: 2025-08-18 17:16:01
原创
791人浏览过
双重检查锁定通过两次检查和加锁确保线程安全且提升性能,C++11后推荐使用局部静态变量实现更安全简洁的单例模式。

c++单例模式实现 线程安全双重检查锁

在C++中实现线程安全的单例模式,双重检查锁定(Double-Checked Locking Pattern, DCLP)是一种常见且高效的方案。它既能保证性能(避免每次调用都加锁),又能确保多线程环境下只创建一个实例。

基本思路

双重检查锁定的核心是在获取实例时进行两次检查:第一次检查是否需要加锁,第二次在锁内检查是否真正需要创建对象,从而减少锁竞争。

以下是使用C++11及以上标准实现的线程安全单例模式(基于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><pre class='brush:php;toolbar:false;'>// 删除拷贝构造和赋值操作
Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&) = delete;
登录后复制

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

static Singleton* instance;
static std::mutex mutex_;
登录后复制

};

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

为什么需要双重检查?

如果只做一次加锁检查,每次调用 getInstance() 都会进入临界区,影响性能。双重检查通过先判断指针是否为空,仅在必要时才加锁,提升了并发效率。

关键点:

沉浸式翻译
沉浸式翻译

沉浸式翻译:全网口碑炸裂的双语对照网页翻译插件

沉浸式翻译 83
查看详情 沉浸式翻译
  • 第一次检查无锁,快速返回已创建的实例
  • 加锁后再次检查,防止多个线程同时创建对象
  • C++11起,nullptr 和内存模型支持使得DCLP在正确实现下是安全的

注意内存释放问题

上面的实现使用 new 创建对象,但没有释放。若需自动释放,可结合智能指针或静态局部变量方式。

更现代的替代方案:使用局部静态变量(C++11起线程安全):

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

static Singleton& getInstance() {
    static Singleton instance; // 局部静态变量,线程安全且自动析构
    return instance;
}
登录后复制

这种方式更简洁、安全,编译器保证初始化的线程安全性,无需手动加锁。除非有特殊需求(如延迟初始化控制),推荐使用此方法。

总结

双重检查锁定可用于实现高性能的线程安全单例,但在C++11以后,优先考虑局部静态变量方式。若必须手动管理,注意使用互斥量和正确的空指针检查顺序。

基本上就这些。

以上就是C++单例模式实现 线程安全双重检查锁的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
热门推荐
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号