使用 C++11 std::call_once 实现的懒汉单例使用 C++11 std::call_once 实现的懒汉单例,C++11 线程安全。
时间: 2024-09-11 17:01:51 浏览: 48
在 C++11 中,`std::call_once` 函数是一个线程安全的宏,它用于确保一个初始化函数只被执行一次。这对于实现懒汉式(Lazy Singleton)设计模式非常有用,即延迟创建单例对象直到第一次被请求。
懒汉单例的基本思想是在首次访问时动态地创建并返回唯一的实例,避免了全局变量带来的潜在风险,并且可以控制单例的生命周期。以下是使用 `std::call_once` 实现懒汉单例的一个示例:
```cpp
#include <mutex>
#include <memory>
class Singleton {
private:
static std::once_flag flag;
static std::shared_ptr<Singleton> instance;
protected:
Singleton() = default; // 防止通过构造函数直接创建实例
public:
static std::shared_ptr<Singleton>& getInstance() {
std::call_once(flag, [] {
if (!instance) {
instance = std::make_shared<Singleton>();
}
});
return instance;
}
// 其他成员函数...
};
std::once_flag Singleton::flag;
std::shared_ptr<Singleton> Singleton::instance = nullptr;
```
在这个例子中,`getInstance()` 函数会保证在第一次被调用时,`instance` 被正确初始化。如果之后再次调用,`call_once` 将不会执行内部的初始化代码,因为已经完成了一次。
阅读全文