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



被折叠的 条评论
为什么被折叠?



