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

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

穿越時空
发布: 2025-12-08 18:19:02
原创
164人浏览过
饿汉式在程序启动时创建实例,天然线程安全;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++免费学习笔记(深入)”;

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

乾坤圈新媒体矩阵管家
乾坤圈新媒体矩阵管家

新媒体账号、门店矩阵智能管理系统

乾坤圈新媒体矩阵管家 219
查看详情 乾坤圈新媒体矩阵管家
示例代码(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)实现线程安全的懒加载

传统加锁方式(适用于旧标准):

#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++中线程安全的懒汉与饿汉式单例的详细内容,更多请关注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号