这是一个用于演示和验证单例模式线程安全性的 C++ 项目,重点关注“多个线程同时获取单例实例时,是否会创建多个对象”。
本项目包含以下实现:
- 饿汉式单例:EagerSingleton
- 懒汉式单例:LazySingleton
- Meyers 单例:MeyersSingleton
- 安全对照单例:SafeSingleton
其中,SafeSingleton 是用于对照测试的线程安全版本,用于说明在多线程环境下如何保证实例唯一。
include/:头文件声明src/:实现文件和测试入口CMakeLists.txt:构建配置文件README.md:项目说明
在项目根目录执行:
cmake -S . -B build
cmake --build buildg++ -std=c++17 src/main.cpp src/EagerSingleton.cpp src/LazySingleton.cpp src/MeyersSingleton.cpp src/SageSingleton.cpp -Iinclude -o app.exeLinux / macOS:
./app.exeWindows PowerShell:
.\app.exe程序入口在 src/main.cpp,测试内容包括:
- 饿汉式单例是否始终返回同一个对象
- 饿汉式单例在多线程下是否安全
- 懒汉式单例无锁版本在多线程下的行为
- 安全对照单例是否能保证线程安全
- Meyers 单例在多线程下是否仍保持唯一实例
本实验关注的核心问题不是 mdata 这类成员变量的原子性,而是:
- 多个线程同时获取单例实例时,是否会创建多个对象
- 是否仍然满足单例模式的唯一性要求
因此,测试的核心判断依据是:不同线程拿到的实例地址是否相同。
如果两个线程得到的地址相同,则说明实现保持了单例;如果不同,则说明存在线程安全问题。
- 饿汉式单例:线程安全
- Meyers 单例:线程安全
- 无锁懒汉式:存在竞态条件,不安全
- 安全对照单例(SafeSingleton):线程安全,适合作为对照实现