1. volatile bool flag;
  2. volatile int a;

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

类型限定符volatile

强制内存读取

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

场景:

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

存在的问题:

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

解决:

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

但是:

寄存器走了,缓存来了,但问题没那么严重

多核cpu分别有自己的缓存,对内存的操作会先通过缓存,在一个cpu对volatile变量进行操作后,会告知其他cpu对其缓存进行处理以更新该volatile变量的值,这个告知并处理的流程会损失一点实时性。

禁止编译优化

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

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

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

加上该限定符后,编译的代码不会乱序,但是执行时可能碰到CPU的乱序执行,即

CPU会对没有明显依赖关系的代码进行乱序执行,但这段代码可能在另一个线程里存在依赖关系,导致原本设计好的逻辑关系不能实现。

此时有两种解决办法:

  • 1.使用c++11标准之后开始提供的的atomic类模板
  1. #include<atomic>
  2. atomic<bool> flag;
  • 2.手动构造happans-before语义

参考:

C/C++ 中 volatile 关键字详解

C/C++中volatile关键字介绍

C/C++ Volatile关键词深度剖析

谈谈C++的volatile关键字以及常见的误解

类型限定符volatile的更多相关文章

  1. C语言中类型限定符

    通常用类型和存储类别来描述一个变量. C90还增加了两个属性:恒常性(constancy).易变性(volatility): 分别用关键字const和volatile来声明. 这两个关键字创建的类型是 ...

  2. ISO/IEC 9899:2011 条款6.7.3——类型限定符

    6.7.3 类型限定符 语法 1.type-qualifier: const restrict volatile _Atomic 约束 2.除了指针类型(其被引用的类型是一个对象类型)之外的类型,不应 ...

  3. C 类型限定符

    C 类型限定符 1. Introduction C 语言中的大部分类型都可以用称为限定符(qualifier)的关键字 const. volatile. restrict. _Atomic 加以限定. ...

  4. CUDA1.1-函数类型限定符与变量类型限定符

    这部分来自于<CUDA_C_Programming_Guide.pdf>,看完<GPU高性能变成CUDA实战>的第四章,觉得这本书还是很好的,是一种循序渐进式的书,值得看,而不 ...

  5. GPU编程自学6 —— 函数与变量类型限定符

    深度学习的兴起,使得多线程以及GPU编程逐渐成为算法工程师无法规避的问题.这里主要记录自己的GPU自学历程. 目录 <GPU编程自学1 -- 引言> <GPU编程自学2 -- CUD ...

  6. C:类型限定符

  7. [汇编与C语言关系]5. volatile限定符

    现在研究一下编译器优化会对生成的指令产生什么影响,在此基础上介绍C语言的volatile限定符.首先看下面的C程序: /* artificial device registers */ unsigne ...

  8. [面试]volatile类型修饰符/内存屏障/处理器缓存

    volatile类型修饰符 本篇文章的目的是为了自己梳理面试知识点, 在这里做一下笔记. 绝大部分内容是基于这些文章的内容进行了copy+整理: 1. http://www.infoq.com/cn/ ...

  9. 解决 “MoveFile”: 类型库“XXX.dll”中的标识符已经是宏;使用“rename”限定符 类型库符号与系统符号冲突问题

    今天在VS工程当中引入一个组件,编译的时候出现警告, “MoveFile”: 类型库“XXX.dll”中的标识符已经是宏:使用“rename”限定符.虽然只是一个警告,但看着实在不爽,更重要的是,警告 ...

随机推荐

  1. python 赋值魔法

    序列解包: >>> x,y,z = 1, 2, 3>>> print(x, y, z)1 2 3 >>> a,b, *reset = [1,2,3 ...

  2. node_exporter安装和配置

    1.二进制包安装 mkdir -p /opt/exporter 下载地址: wget https://github.com/prometheus/node_exporter/releases/down ...

  3. js 数组 删除第一个和最后一个

    .shift();   删除第一个 .pop();   删除最后一个

  4. springboot+mybatis+druid+sqlite/mysql/oracle

    搭建springboot+mybatis+druid+sqlite/mysql/oracle附带测试 1.版本 springboot2.1.6 jdk1.8 2.最简springboot环境 http ...

  5. Sketch教程

    去年夏天开始用Sketch,觉得它放Dock里闪亮亮的很好看,当时笑称是男盆友送我的第一颗小钻石噗哈哈.所以那段时间几乎刷遍了所有关于 Sketch 的网站.文章.教程,之后又在自学设计,因为想和更多 ...

  6. 去除IntelliJ IDEA对重复代码的检测

    方法1:  方法2:(比较简便) 

  7. tensorflow训练时用到的一些“工具”

    1.graph和参数的store和restore 2.tensorboard查看 2.1tensorboard根据.meta文件查看图 2.2如何看图

  8. suduku

    github地址 PSP: PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟) Planning 计划 30 30 Estimate 估 ...

  9. Linux 配置eth0网卡

    缘由: 最近要复习docker,电脑没有centos7,于是下载了一个最新版的centos7,迫于强迫症没有eth0网卡,为了将ens33改为eth0于是寻求方法. 1.编辑网卡的配置文件 vi /e ...

  10. Mybatis generator配置

    <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE generatorConfiguration ...