写一个多线程c++安全的单例,使用锁实现
时间: 2024-09-15 09:15:21 浏览: 111
在C++中,实现一个线程安全的单例模式通常会利用互斥量(mutex)来保证同步访问,防止数据竞争。下面是一个简单的例子,展示了如何使用`std::mutex`和`std::lock_guard`来创建一个安全的单例:
```cpp
#include <mutex>
#include <iostream>
class Singleton {
private:
static std::once_flag flag; // 一次性构造标志
static std::unique_ptr<Singleton> instance; // 单例实例
// 构造函数保持私有,防止直接创建实例
Singleton() = default;
public:
// 获取唯一实例
static Singleton* getInstance() {
std::call_once(flag, [] { instance.reset(new Singleton()); }); // 使用std::call_once确保只初始化一次
std::lock_guard<std::mutex> lock(mutex); // 保护获取过程
return instance.get(); // 返回指向单例的指针
}
// 其他公共方法...
private:
static std::mutex mutex; // 互斥锁
};
// 初始化静态成员变量
std::once_flag Singleton::flag;
std::unique_ptr<Singleton> Singleton::instance;
std::mutex Singleton::mutex;
int main() {
auto* singleton1 = Singleton::getInstance();
auto* singleton2 = Singleton::getInstance();
if (singleton1 == singleton2) {
std::cout << "Singleton instances are the same" << std::endl;
}
return 0;
}
```
在这个实现中,`std::call_once`用于确保单例仅被初始化一次,而`std::lock_guard`则确保了对实例获取的线程安全。每次调用`getInstance`时,都会自动获取并释放互斥锁。
阅读全文