2.C++单例模式懒汉式推荐的两种实例化方法
方案 1:局部静态变量版(C++11+ 最优,推荐首选)
代码实例:
1 | // 核心:懒汉式实例化 + 线程安全(C++11 标准保证) |
核心原理:
- C++11 标准兜底:ISO C++11 明确规定,函数内的局部静态变量在多线程环境下,初始化过程会由编译器自动插入「原子操作 + 锁」,保证仅一个线程完成初始化,后续线程直接返回已初始化的实例;
- 懒加载:
instance直到第一次调用GetInstance()才会创建,程序启动时无开销; - 自动析构:静态变量存储在进程的静态区,程序退出时会自动调用析构函数(无需手动释放,无内存泄漏)。
方案 2:用std::once_flag + std::call_once实现
代码实例:
可结合Lambda表达式实现
1 | // 核心:类级静态成员(全局唯一) |
核心原理:
std::once_flag:一个轻量级标记,标记 “某个初始化逻辑是否已经执行过”;std::call_once:接收once_flag和一个可调用对象,保证该可调用对象在整个程序生命周期中仅执行一次(无论多少线程调用);- 懒汉式契合点:把 “单例实例创建” 作为
call_once的可调用对象,第一次调用GetInstance时触发初始化,后续调用直接返回已创建的实例,完美实现 “懒加载 + 线程安全”。
All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.