写一个多线程c++安全的单例
时间: 2024-09-15 14:15:23 浏览: 53
使用C++11实现线程安全的单例模式
在C++中,编写一个多线程安全的单例通常需要考虑避免数据竞争和死锁。一个常见的做法是利用`std::call_once`配合互斥量来实现,这里是一个简单的例子:
```cpp
#include <mutex>
#include <memory>
class Singleton
{
private:
// 使用智能指针防止多次构造
static std::once_flag flag;
static std::shared_ptr<Singleton> instance;
// 构造函数为私有,防止外部直接创建
Singleton() {}
public:
// 单例获取方法
static std::shared_ptr<Singleton>& getInstance()
{
std::call_once(flag, [] {
std::lock_guard<std::mutex> lock(singletonMutex);
if (!instance)
instance = std::make_shared<Singleton>();
});
return instance;
}
// 其他公共方法...
};
// 互斥量和初始标志
std::once_flag Singleton::flag;
std::mutex Singleton::singletonMutex;
// 实例化必须在getInstance之后
int main()
{
std::shared_ptr<Singleton> sp = Singleton::getInstance();
sp->doSomething();
return 0;
}
```
在这个例子中,我们确保了只有在第一次请求时才初始化单例,并且在整个生命周期中全局唯一的`instance`总是由`getInstance`方法提供。`std::call_once`会保证初始化代码只运行一次,`std::lock_guard`则自动管理了对`singletonMutex`的加解锁,避免了竞态条件。
阅读全文