//C++11以后,使用局部变量懒汉不用加锁
时间: 2024-09-15 22:15:10 浏览: 107
C++代码:使用静态局部变量统计函数被调用次数
在 C++11 及以后的版本中,引入了 `std::once_flag` 和 `std::call_once` 函数来支持单例模式(Singleton Pattern)中的线程安全初始化。当需要在程序中创建一个懒加载的单例实例时,如果该实例的初始化不是线程安全的,可以使用这些新的特性来避免不必要的同步开销。
在传统的单例实现中,为了防止多次构造导致的问题,通常会使用静态成员函数并加锁。但在 C++11 的 `std::call_once` 中,你可以将实例的初始化代码包裹在一个 `once_flag` 和一个无参的 lambda 表达式中,这个表达式会在第一次执行时执行,并且保证在整个程序中只执行一次。由于 `call_once` 内部已经处理了线程安全,所以在多个线程同时访问时,无需外部额外加锁。
示例代码:
```cpp
class Singleton {
private:
static std::once_flag flag;
static MyClass* instance;
public:
// 使用 RAII 技术确保初始化仅执行一次
MyClass& getInstance() {
std::call_once(flag, [] {
instance = new MyClass(); // 初始化操作
});
return *instance;
}
private:
Singleton() = default; // 防止直接构造
~Singleton() = delete; // 防止复制构造和赋值拷贝
};
// 保证只初始化一次
std::once_flag Singleton::flag;
MyClass* Singleton::instance = nullptr;
```
阅读全文