c++单例类双重判断加锁
时间: 2025-01-06 16:13:43 浏览: 4
### 实现带有双重检查锁定的单例模式
为了优化性能并减少不必要的锁开销,在C++中可以采用双重检查锁定(Double-Checked Locking Pattern)。这种方法通过引入额外的`nullptr`检查来避免每次访问实例时都进行加锁操作。
下面是一个改进后的实现方式:
```cpp
class Singleton {
private:
static std::atomic<Singleton*> instance;
static std::mutex mutex;
Singleton() {}
public:
static Singleton* getInstance() {
Singleton* localInstance = instance.load(std::memory_order_relaxed);
if (localInstance == nullptr) { // First check without lock
std::lock_guard<std::mutex> lock(mutex);
localInstance = instance.load(std::memory_order_acquire);
if (localInstance == nullptr) { // Second check with lock
localInstance = new Singleton();
instance.store(localInstance, std::memory_order_release);
}
}
return localInstance;
}
~Singleton() {}
};
std::atomic<Singleton*> Singleton::instance(nullptr);
std::mutex Singleton::mutex;
```
在这个例子中,使用了原子变量 `std::atomic<T>` 来存储单例指针,并设置了恰当的记忆序(Memory Order),以确保多线程环境下的可见性和顺序性[^1]。此外,两次对 `m_Instance` 的检测减少了竞争条件的发生概率,提高了效率。
值得注意的是,早期版本可能存在一些问题,比如每次都获取锁会带来较高的开销;而在某些平台上可能会遇到指令重排序带来的竞态条件风险。因此上述代码采用了更安全的做法,即先不带锁地读取一次共享数据,只有当确实需要初始化的时候才真正进入临界区执行同步逻辑[^4]。
阅读全文