您的位置:首页 >C++单例线程安全双重检查锁实现
发布于2025-11-29 阅读(0)
扫一扫,手机访问
双重检查锁定通过两次检查和加锁确保线程安全且提升性能,C++11后推荐使用局部静态变量实现更安全简洁的单例模式。

在C++中实现线程安全的单例模式,双重检查锁定(Double-Checked Locking Pattern, DCLP)是一种常见且高效的方案。它既能保证性能(避免每次调用都加锁),又能确保多线程环境下只创建一个实例。
双重检查锁定的核心是在获取实例时进行两次检查:第一次检查是否需要加锁,第二次在锁内检查是否真正需要创建对象,从而减少锁竞争。
以下是使用C++11及以上标准实现的线程安全单例模式(基于DCLP):
#include <mutex>class Singleton { public: // 获取唯一实例 static Singleton* getInstance() { // 第一次检查:避免不必要的加锁 if (instance == nullptr) { std::lockguard<std::mutex> lock(mutex); // 第二次检查:确保只有一个线程创建实例 if (instance == nullptr) { instance = new Singleton(); } } return instance; }
// 删除拷贝构造和赋值操作 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() 都会进入临界区,影响性能。双重检查通过先判断指针是否为空,仅在必要时才加锁,提升了并发效率。
关键点:
上面的实现使用 new 创建对象,但没有释放。若需自动释放,可结合智能指针或静态局部变量方式。
更现代的替代方案:使用局部静态变量(C++11起线程安全):
static Singleton& getInstance() {
static Singleton instance; // 局部静态变量,线程安全且自动析构
return instance;
}
这种方式更简洁、安全,编译器保证初始化的线程安全性,无需手动加锁。除非有特殊需求(如延迟初始化控制),推荐使用此方法。
双重检查锁定可用于实现高性能的线程安全单例,但在C++11以后,优先考虑局部静态变量方式。若必须手动管理,注意使用互斥量和正确的空指针检查顺序。
基本上就这些。
上一篇:小红书店铺管理入口及登录指南
下一篇:快看漫画官网入口及在线观看地址
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
9