码迷,mamicode.com
首页 > 其他好文 > 详细

类型限定符volatile

时间:2019-11-12 21:47:06      阅读:85      评论:0      收藏:0      [点我收藏+]

标签:csdn   -o   http   sdn   oob   flag   keyword   乱序   atomic   

volatile bool flag;
volatile int a;

添加volatile限定符的变量会获得几个特性:

1.强制内存读取

因为这个数据是“易变的(volatile)”,所以要时刻关注,不能偷懒
场景:

把内存中的变量拷贝到寄存器中进行处理以加快速度;

存在的问题:

是对变量的拷贝进行处理,而变量本体如果发生变化可能也不会察觉

解决:

加上volatile限定符后,每次处理都会直接从内存读取,所以可以感知变量的变化。

但是:

寄存器走了,缓存来了,但问题没那么严重
多核cpu分别有自己的缓存,对内存的操作会先通过缓存,在一个cpu对volatile变量进行操作后,会告知其他cpu对其缓存进行处理以更新该volatile变量的值,这个告知并处理的流程会损失一点实时性。

2.禁止编译优化

“聪明的”编译器在满足“同输入便会同输出”的as-if原则的前提下,会在编译的过程中对代码进行优化,

  • 避免丢失:使得和输出无关的代码可能被优化掉,而如果这部分代码是有意义的,便是个问题。在加上限定符后,会老老实实地编译这部分代码。
  • 保证顺序:某些和编译器优化逻辑不同的语句会被调换位置,加上后便会按照代码顺序执行。

3.注意:volatile不能够保证线程同步

加上该限定符后,编译的代码不会乱序,但是执行时可能碰到CPU的乱序执行,即
CPU会对没有明显依赖关系的代码进行乱序执行,但这段代码可能在另一个线程里存在依赖关系,导致原本设计好的逻辑关系不能实现。
此时有两种解决办法:

  • 1.使用c++11标准之后开始提供的的atomic类模板
#include<atomic>

atomic<bool> flag;
  • 2.手动构造happans-before语义

参考:
C/C++ 中 volatile 关键字详解
C/C++中volatile关键字介绍
C/C++ Volatile关键词深度剖析
谈谈C++的volatile关键字以及常见的误解

类型限定符volatile

标签:csdn   -o   http   sdn   oob   flag   keyword   乱序   atomic   

原文地址:https://www.cnblogs.com/j-c-y/p/11845356.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!