c++11标准懒汉式单例模式线程安全吗
时间: 2024-09-17 17:05:17 浏览: 56
C++11标准中的懒汉式单例模式通常是非线程安全的,因为它依赖于静态初始化顺序控制,这在多线程环境中可能会导致不可预测的结果。当多个线程同时访问该单例实例时,如果没有额外的同步措施,可能会创建多个实例。
为了使其在多线程环境下线程安全,可以采用双重检查锁定(Double-Check Locking)技术。即在获取锁之前先检查实例是否已经创建,如果未创建,则加锁并创建;如果已创建,则直接返回。这种方法确保了只有在第一次请求时才会初始化,并且在此过程中保持了互斥:
```cpp
// 使用std::mutex保证线程安全
class Singleton {
private:
static std::once_flag flag;
static Singleton* instance;
Singleton() = default; // 防止复制构造
public:
static Singleton& getInstance() {
std::call_once(flag, []{
std::lock_guard<std::mutex> lock(singletonMutex);
if (!instance) {
instance = new Singleton();
}
});
return *instance;
}
private:
Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&) = delete;
};
std::once_flag Singleton::flag;
std::mutex Singleton::singletonMutex;
Singleton* Singleton::instance = nullptr;
```
在这个版本中,`getInstance()`函数会确保在多线程下只会初始化一次。
阅读全文