给这个模板单例类添加线程锁
时间: 2024-11-03 21:20:55 浏览: 10
2023年最新面试合集-最新版Java+最常见的+200++面试题汇总+答案总结汇总
为了在模板单例类中添加线程安全性,特别是在多线程环境下,你可以考虑使用互斥量 (mutex) 来同步对单例的获取操作。这里是一种常见的做法:
1. 在模板基类 `SingletonBase` 中引入 `std::mutex` 和 `std::lock_guard`,它们分别用于锁定和解锁资源。
```cpp
template <typename T>
class SingletonBase {
private:
static std::unique_ptr<T> instance;
static std::mutex mtx;
SingletonBase() = delete;
public:
static T* getInstance() {
std::lock_guard<std::mutex> lock(mtx);
if (!instance) {
instance = std::make_unique<T>();
}
return instance.get();
}
// 添加析构函数释放单例,防止循环引用
~SingletonBase() { instance.reset(); }
};
// 初始化互斥量
template <typename T>
std::mutex SingletonBase<T>::mtx;
```
2. 现在,每次调用 `getInstance()` 时,都会自动获取到互斥量的锁,确保同一时间只有一个线程能进入单例的创建过程。
注意:如果多个线程同时到达,第一个线程将获得锁并创建实例,其他线程会被阻塞直到该线程完成。这可能会导致短暂的性能下降,但在大多数情况下是可以接受的。
阅读全文