饿汉式在程序启动时创建实例,天然线程安全;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++免费学习笔记(深入)”;
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)实现线程安全的懒加载。
传统加锁方式(适用于旧标准):
#includeclass 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 #includeclass 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++如何实现单例设计模式_C++中线程安全的懒汉与饿汉式单例的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1488410.html
微信扫一扫
支付宝扫一扫