全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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

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

单例设计模式确保一个类只有一个实例,并提供全局访问点。在C++中,常见的实现方式有“饿汉式”和“懒汉式”,两者在初始化时机和线程安全性上有所不同。下面分别介绍线程安全的实现方法。

饿汉式单例(线程安全)

饿汉式在程序启动时就创建实例,由于静态变量在程序加载时完成初始化,因此天然线程安全。

优点是无需考虑多线程竞争;缺点是可能提前占用资源,即使从未使用该实例。

示例代码:

class Singleton {
private:
    static Singleton instance; // 静态成员,在程序启动时构造
    Singleton() {} // 私有构造函数

public: static Singleton& getInstance() { return instance; }

Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&) = delete;

}; // 定义静态成员 Singleton Singleton::instance;

懒汉式单例(线程安全)

懒汉式延迟创建实例,直到第一次调用 getInstance() 时才初始化。在多线程环境下,必须保证初始化过程线程安全。

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

示例代码(C++11 局部静态变量):

class Singleton {
private:
    Singleton() {}

public: static Singleton& getInstance() { static Singleton instance; // C++11 起线程安全 return instance; }

Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&) = delete;

};

如果不能使用 C++11 或以上版本,可使用互斥锁(mutex)实现线程安全的懒加载。

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

#include 

class Singleton { private: static Singleton* instance; static std::mutex mtx; Singleton() {}

public: static Singleton* getInstance() { if (instance == nullptr) { // 双重检查锁定减少锁开销 std::lock_guard lock(mtx); if (instance == nullptr) { instance = new Singleton(); } } return instance; }

Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&) = delete;

};

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

智能指针优化懒汉式

为避免手动管理内存,可用智能指针结合锁机制自动释放资源。

#include 
#include 

class Singleton { private: static std::unique_ptr instance; static std::mutex mtx; Singleton() {}

public: static Singleton* getInstance() { std::lock_guard lock(mtx); if (!instance) { instance = std::unique_ptr(new Singleton()); } return instance.get(); }

Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&) = delete;

};

std::unique_ptr Singleton::instance = nullptr; std::mutex Singleton::mtx;

基本上就这些。C++中实现线程安全的单例,优先使用局部静态变量(Meyers 单例),代码简洁且高效。若需更复杂的控制或兼容旧环境,再考虑加锁方案。不复杂但容易忽略细节,比如删除拷贝构造和赋值操作。


# 懒加载  # c++  # 指针  # 线程  # 多线程  # 启动时  # 加锁  # 这是  # 加载  # 互斥  # 首次  # 推荐使用  # 适用于  # 有所不同 


相关文章: 如何基于云服务器快速搭建网站及云盘系统?  网站制作专业公司有哪些,如何制作一个企业网站,建设网站的基本步骤有哪些?  音乐网站服务器如何优化API响应速度?  如何在局域网内绑定自建网站域名?  如何快速启动建站代理加盟业务?  如何通过FTP服务器快速搭建网站?  如何基于PHP生成高效IDC网络公司建站源码?  如何撰写建站申请书?关键要点有哪些?  C++如何使用std::optional?(处理可选值)  义乌企业网站制作公司,请问义乌比较好的批发小商品的网站是什么?  已有域名和空间如何快速搭建网站?  成都响应式网站开发,dw怎么把手机适应页面变成网页?  如何正确下载安装西数主机建站助手?  中山网站制作网页,中山新生登记系统登记流程?  如何通过主机屋免费建站教程十分钟搭建网站?  如何用IIS7快速搭建并优化网站站点?  高端企业智能建站程序:SEO优化与响应式模板定制开发  c++怎么使用类型萃取type_traits_c++ 模板元编程类型判断【方法】  建站之星如何取消后台验证码生成?  内网网站制作软件,内网的网站如何发布到外网?  ,巨量百应是干嘛的?  成都网站制作价格表,现在成都广电的单独网络宽带有多少的,资费是什么情况呢?  制作网站公司那家好,网络公司是做什么的?  建站主机服务器选购指南:轻量应用与VPS配置解析  小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?  如何选购建站域名与空间?自助平台全解析  如何高效配置香港服务器实现快速建站?  建站之星北京办公室:智能建站系统与小程序生成方案解析  香港服务器WordPress建站指南:SEO优化与高效部署策略  如何高效完成独享虚拟主机建站?  家庭建站与云服务器建站,如何选择更优?  如何在IIS中新建站点并配置端口与IP地址?  高防服务器:AI智能防御DDoS攻击与数据安全保障  成都网站制作公司哪家好,四川省职工服务网是做什么用?  建站之星体验版:智能建站系统+响应式设计,多端适配快速建站  如何选择适合PHP云建站的开源框架?  宝塔建站助手安装配置与建站模板使用全流程解析  如何将凡科建站内容保存为本地文件?  建站之星伪静态规则如何正确配置?  如何获取上海专业网站定制建站电话?  如何选择高效便捷的WAP商城建站系统?  建站之星后台密码如何安全设置与找回?  网站制作怎么样才能赚钱,用自己的电脑做服务器架设网站有什么利弊,能赚钱吗?  如何快速搭建安全的FTP站点?  建站之星安全性能如何?防护体系能否抵御黑客入侵?  杭州银行网站设计制作流程,杭州银行怎么开通认证方式?  湖南网站制作公司,湖南上善若水科技有限公司做什么的?  css网站制作参考文献有哪些,易聊怎么注册?  公众号网站制作网页,微信公众号怎么制作?  已有域名和空间,如何快速搭建网站? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。