C++11实现线程安全的单例模板
1、单例模式是一种创建型设计模式,核心是
保证一个类在整个程序运行期间只有一个实例,并提供一个全局访问点来获取它。2、线程安全是指在多线程并发环境下,代码或对象在被多个线程同时访问时仍能保持
结果正确、状态一致且不发生竞态条件。
为了防止单例类在多线程情况下被多次实例化,需要保证单例模板在获取实例时仅仅只实例化一次。
例如懒汉式单例模板,这会导致在多个线程中被多次实例化
1 | static std::shared_ptr<T> GetInstance() { |
测试(所用代码在下文)
1 |
|
如下图所示,继承单例模板的类TestClass被多次初始化,是非线程安全的
线程安全的模板
- 生命周期自动管理
_instance是静态成员,用shared_ptr可以在程序结束时自动析构对象(或最后一个引用释放时析构),不用手动delete。 - 调用方也拿到 shared_ptr
外部每次GetInstance()都会拷贝一个shared_ptr,引用计数 +1,确保对象在被使用期间不会被销毁。
1 |
|
测试
1 |
|
1 |
|
如下图所示,TestClass只被初始化了一次,且在线程t1和t2分别调用PrintAddress,输出结果完全一致,证明了在多线程下该单例模板是安全的,没有出现多次实例化的情况
说些什么吧!