C++线程安全的单例模式
时间: 2023-09-11 09:13:15 浏览: 61
在 C++ 中实现线程安全的单例模式可以使用以下方法:
1. 懒汉式,加锁:使用 `std::mutex` 来实现线程安全,确保在多线程环境下只创建一个实例。在 getInstance() 方法中使用 `std::lock_guard` 来对互斥锁进行自动加锁和解锁。
```cpp
#include <mutex>
class Singleton {
private:
static Singleton* instance;
static std::mutex mtx;
Singleton() {}
public:
static Singleton* getInstance() {
std::lock_guard<std::mutex> lock(mtx);
if (instance == nullptr) {
instance = new Singleton();
}
return instance;
}
};
Singleton* Singleton::instance = nullptr;
std::mutex Singleton::mtx;
```
2. 双重检查锁定:在懒汉式的基础上进行改进,减少锁的使用次数,提高性能。在 getInstance() 方法内部加入双重检查,第一次检查不加锁,只有在实例为 nullptr 时才加锁创建实例。
```cpp
#include <mutex>
class Singleton {
private:
static Singleton* instance;
static std::mutex mtx;
Singleton() {}
public:
static Singleton* getInstance() {
if (instance == nullptr) {
std::lock_guard<std::mutex> lock(mtx);
if (instance == nullptr) {
instance = new Singleton();
}
}
return instance;
}
};
Singleton* Singleton::instance = nullptr;
std::mutex Singleton::mtx;
```
这些方式都可以实现线程安全的单例模式,具体选择哪种方式取决于具体的场景和需求。需要注意的是,在多线程环境下,使用静态变量来保存实例时,需要保证其线程安全性,可以使用互斥锁 (`std::mutex`) 或其他线程同步机制来实现。