c++ 单例里面创建线程
时间: 2024-10-22 09:01:24 浏览: 22
在C++的单例模式中创建线程,需要特别注意线程安全问题,因为如果多个线程同时尝试获取或初始化单例,可能会导致多个实例被创建。以下是处理这种情况的一种常见做法:
1. **懒汉式单例**(非线程安全):虽然简单,但在多线程环境中可能导致问题。这时可以添加双重检查锁定(double-checked locking)来确保线程安全:
```cpp
// 使用互斥锁
class Singleton {
private:
static std::mutex mtx;
static Singleton* instance;
public:
Singleton(Singleton const&) = delete;
Singleton& operator=(Singleton const&) = delete;
// 线程不安全,增加互斥锁
Singleton() {
if (!instance) {
std::lock_guard<std::mutex> lock(mtx);
if (!instance) {
instance = new Singleton();
}
}
}
~Singleton() { delete instance; }
static Singleton* getInstance() {
std::call_once(initFlag, &Singleton::createInstance);
return instance;
}
};
```
2. **饿汉式单例**(线程安全):提前在加载时就创建了单例,适合多线程环境下:
```cpp
// 创建静态全局实例并加锁
class Singleton {
private:
static Singleton* instance;
Singleton() {}
friend class SingletonTest; // 仅限测试用,防止编译警告
public:
static Singleton* getInstance() {
return instance;
}
};
// 初始化
Singleton* Singleton::instance = new Singleton();
```
3. **静态局部变量**(线程安全):利用静态局部变量确保每个线程只会看到已经存在的单例:
```cpp
class Singleton {
private:
static Singleton* instance;
public:
static Singleton* getInstance() {
return instance ? instance : (instance = new Singleton());
}
};
```
以上每种方法都需要考虑性能和内存消耗,根据实际需求选择合适的策略。
阅读全文