//C++11以后,使用局部变量懒汉不用加锁 static Log *get_instance() { static Log instance; return &instance; }
时间: 2024-09-15 21:15:16 浏览: 69
build_log.zip_C++ Log 输出_c语言log_gently77w
在C++11及其后续版本中,引入了线程局部存储(Thread Local Storage,TLS)的概念,这使得在某些特定条件下,无需全局互斥锁就能实现类似懒汉模式的单例。上述代码利用的是这种特性,`Log`的实例作为线程局部变量,每个线程会有一个独立的实例副本。当在函数内部访问这个静态局部变量时,实际上是为当前线程创建或获取一个新的实例。
```cpp
// C++11后的懒汉单例,无锁实现(仅在多线程环境中有效)
static std::once_flag flag; // 使用once_flag标记是否已初始化
Log* get_instance() {
std::call_once(flag, []{
// 只在线程第一次进入此函数时初始化
static Log instance; // 线程局部实例
});
return &instance; // 返回当前线程对应的实例
}
```
这种方法避免了多线程环境下同步的问题,但在单线程应用中或者多线程但全局只有一个实例的情况下,仍然适用。不过需要注意,如果后续需要在其他地方共享这个实例,还是需要全局互斥机制来确保一致性。
阅读全文