单件类的安全实现

news/2024/7/8 20:42:59

1. 不安全的实现方法

std::unique_ptr<Interface> instance_(nullptr);static Interface* GetInstance() {if (instance_.get() == nullptr) {instance_.reset(new Interface());}return instance_.get();
}

instance_.reset(new Interface)包含了三步:

1)分配内存;

2)在内存的位置上调用构造函数;

3)将地址赋值给instance_。

CPU在动态调度的时候认为2)和3)的顺序是可以互相颠倒的。因此,如果出现另一个对GetInstance()的并发调用,完全有可能出现因为先调用3),而2)的构造函数操作没完成时,instance_.get() == nullptr判断为false,返回了一个未构造完的instance_导致崩溃。

2. 安全的实现方法

《Effective C++》推荐如下写法,但该写法只对C++11及以后的版本才是安全的。

static Interface* GetInstance() {static Interface instance;return &instance;
}

http://lihuaxi.xjx100.cn/news/248447.html

相关文章

spring cloud快速搭建

为什么80%的码农都做不了架构师&#xff1f;>>> 一&#xff1a;注册中心 服务提供者&#xff08;简单&#xff09; 注册中心本身就可以是服务提供者&#xff0c;如果有需求可以分开。 1&#xff1a;pom.xml <?xml version"1.0" encoding"UTF-8…

测试找人

2019独角兽企业重金招聘Python工程师标准>>> tomcat 测试找人 转载于:https://my.oschina.net/zhouyuan/blog/125854

郭光灿院士--奇妙的量子世界笔记1(量子世界和经典世界区联系)

视频来源&#xff1a; 网易公开课 图片来源&#xff1a;视频中截图 声明&#xff1a;视频只看了一遍&#xff0c;不求甚解&#xff0c;一些地方难免出错还望指正 1. 为什么神奇&#xff1f; 这个神奇是对比经典世界&#xff08;特点就是确定性&#xff09;&#xff0c;显示出来…

T-SQL WITH 分号问题

使用with 前面有sql语句时候 运行 with tempTbale(id) as ( select ..... )select * from tempTbale 运行上面语句 提示下面错误 Incorrect syntax near the keyword with. If this statement is a common table expression, an xmlnamespaces clause or a change tracking con…

request与session的联系与区别

目录 定义区别 request session 方法区别 request session 补充 定义区别 request request范围较小一些&#xff0c;request是某一次访问的局域变量&#xff0c;只是一个请求。request对象的生命周期是针对一个客户端(说确切点就是一个浏览器应用程序)的一次请求&#x…

程序员的成长

程序员职业发展路线 打工人的基础能力 一线管理者基础功

属性动画

2019独角兽企业重金招聘Python工程师标准>>> 属性动画 就是增强版补间动画&#xff0c;他强大在&#xff1a; 1.补间动画只能定义两个关键帧在透明度&#xff0c;旋转&#xff0c;倾斜&#xff0c;位移&#xff0c;4个方面的变化&#xff0c;但属性动画可以定义任何…

[QA]Python字节码优化问题

这篇文章来自在Segmentfault 上面我提出的一个问题 问题背景&#xff1a; Python在执行的时候会加载每一个模块的PyCodeObject,其中这个对象就包含有opcode,也就是这个模块所有的指令集合&#xff0c;具体定义在源码目录的 /include/opcode.h 中定义了所有的指令集合&#xff0…