方案 1:局部静态变量版(C++11+ 最优,推荐首选)

代码实例:

1
2
3
4
5
6
// 核心:懒汉式实例化 + 线程安全(C++11 标准保证)
static LogicSystem& GetInstance() {
// C++11 标准:局部静态变量的初始化是线程安全的,仅第一次调用时创建
static LogicSystem instance;
return instance;
}

核心原理:

  • C++11 标准兜底:ISO C++11 明确规定,函数内的局部静态变量在多线程环境下,初始化过程会由编译器自动插入「原子操作 + 锁」,保证仅一个线程完成初始化,后续线程直接返回已初始化的实例;
  • 懒加载instance 直到第一次调用 GetInstance() 才会创建,程序启动时无开销;
  • 自动析构:静态变量存储在进程的静态区,程序退出时会自动调用析构函数(无需手动释放,无内存泄漏)。

方案 2:用std::once_flag + std::call_once实现

代码实例:

可结合Lambda表达式实现

1
2
3
4
5
6
7
8
9
10
11
// 核心:类级静态成员(全局唯一)
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 时触发初始化,后续调用直接返回已创建的实例,完美实现 “懒加载 + 线程安全”。