C++——volatile关键字的学习
首先声明一点,本文是关于volatile关键字的学习,学习内容主要是来自一些大牛的网络博客。
一篇是何登成先生的C/C++ Volatile关键词深度剖析(http://hedengcheng.com/?p=725)
一篇是chao_yu的C/C++中volatile关键字详解(https://www.cnblogs.com/yc_sunniwell/archive/2010/07/14/1777432.html)
还有一篇来自于官方文档(https://zh.cppreference.com/w/cpp/language/cv)
本文旨在于学习和记录,因此会有一些内容直接抄的上述博客,向上述博客大牛致以崇高的敬意。特此声明。
在看代码的时候,发现有使用volatile的关键字,但是一知半解,因此搜索了一些关于volatile的相关资料。总结(摘抄)如下:
1. CV类型限定符中,const被定义为常类型,volatile 被定义为易变的类型。
const 对象——类型为 const-qualified 的对象,或 const 对象的非 mutable 子对象。这种对象不能修改:尝试直接这么做是编译时错误,且尝试间接这么做(例如通过到非 const 类型的引用或指针修改 const 对象)导致未定义行为。
volatile 对象——类型为 volatile-qualified 的对象,或 volatile 对象的子对象,或 const volatile 对象的 mutable 子对象。通过 volatile 限定类型泛左值表达式的每次访问(读或写操作、成员函数调用等)都被当作对于优化目的的可见副效应(即在执行的单一线程内, volatile 访问不能被优化掉或者与另一先序或后序于该 volatile 访问的可见副效应重排序。这使得 volatile 对象适用于与信号处理函数的交流,但不适于与另一执行线程交流,参阅 std::memory_order )。试图通过非 volatile 泛左值引用 volatile 对象(例如,通过到非 volatile 类型的引用或指针)会导致未定义行为。
const volatile 对象——类型为 const-volatile-qualified 的对象, const volatile 对象的非 mutable 子对象, volatile 对象的 const 子对象,或非 mutable 对象的 const 子对象。表现同 const 对象与 volatile 对象两者。
2.volatile的特性
2.1 易变性。 在汇编层面观察,两条语句,下一条语句不会直接使用上一条语句对应的volatile变量的寄存器内容,而是直接从内存中读取。
2.2 不可优化性。volatile告诉编译器,不要对我这个变量进行各种激进的优化,甚至将变量直接消除,保证程序员写在代码中的指令,一定会被执行。相对于前面提到的第一个特性:”易变”性,”不可优化”特性可能知晓的人会相对少一些。
2.3 顺序性。C/C++ Volatile关键词前面提到的两个特性,让Volatile经常被解读为一个为多线程而生的关键词:一个全局变量,会被多线程同时访问/修改,那么线程内部,就不能假设此变量的不变性,并且基于此假设,来做一些程序设计。当然,这样的假设,本身并没有什么问题,多线程编程,并发访问/修改的全局变量,通常都会建议加上Volatile关键词修饰,来防止C/C++编译器进行不必要的优化。
3.总结
C/C++ Volatile关键词的第三个特性:”顺序性”,能够保证Volatile变量间的顺序性,编译器不会进行乱序优化。Volatile变量与非Volatile变量的顺序,编译器不保证顺序,可能会进行乱序优化。同时,C/C++ Volatile关键词,并不能用于构建happens-before语义,因此在进行多线程程序设计时,要小心使用volatile,不要掉入volatile变量的使用陷阱之中。
C++——volatile关键字的学习的更多相关文章
- JAVA多线程基础学习三:volatile关键字
Java的volatile关键字在JDK源码中经常出现,但是对它的认识只是停留在共享变量上,今天来谈谈volatile关键字. volatile,从字面上说是易变的.不稳定的,事实上,也确实如此,这个 ...
- Java多线程学习(三)volatile关键字
转载请备注地址:https://blog.csdn.net/qq_34337272/article/details/79680693 系列文章传送门: Java多线程学习(一)Java多线程入门 Ja ...
- JAVA多线程学习- 三:volatile关键字
Java的volatile关键字在JDK源码中经常出现,但是对它的认识只是停留在共享变量上,今天来谈谈volatile关键字. volatile,从字面上说是易变的.不稳定的,事实上,也确实如此,这个 ...
- volatile关键字 学习记录2
public class VolatileTest2 implements Runnable{ volatile int resource = 0; public static void main(S ...
- volatile关键字 学习记录1
虽然已经工作了半年了...虽然一直是在做web开发....但是平时一直很少使用多线程..... 然后最近一直在看相关知识..所以就有了这篇文章 用例子来说明问题吧 public class Volat ...
- Java并发编程学习笔记 深入理解volatile关键字的作用
引言:以前只是看过介绍volatile的文章,对其的理解也只是停留在理论的层面上,由于最近在项目当中用到了关于并发方面的技术,所以下定决心深入研究一下java并发方面的知识.网上关于volatile的 ...
- C语言学习及应用笔记之四:C语言volatile关键字及其使用
在C语言中,还有一个并不经常使用但却非常有用的关键字volatile.那么使用volatile关键字究竟能干什么呢?接下来我将就此问题进行讨论. 一个使用volatile关键字定义变量,其实就是告诉编 ...
- java线程学习之volatile关键字
volatile变量的主要作用:是使变量在多个线程间可见. 在java中每一个线程都会有一块工作内存区,其中存放着所有线程共享的主内存的变量值的拷贝.当线程执行时,它在自己的工作内存区操作这些变量,为 ...
- Java并发编程学习:volatile关键字解析
转载:https://www.cnblogs.com/dolphin0520/p/3920373.html 写的非常棒,好东西要分享一下 Java并发编程:volatile关键字解析 volatile ...
随机推荐
- Js的运算符
JS的运算符 1.运算符的分类: a) 算数运算符 b) 字符串运算符 c) 赋值运算符 d) 比较运算符 e) 逻辑运算符 f) 位运算符 g) 其他运算符 2.算数运算符 + 加法运算符 - 减法 ...
- clusterware启动顺序——CSS
CSS层面 1.ocssd.bin守护进程 该层面最主要的工作就是启动ocssd.bin守护进程.使本地节点能够成功地加入集群.ocssd.bin守护进程的启动过程可以通过以下的图形进行描述. ::: ...
- js递归算法1+ 2+3.....100的和
function num(n){ if(n==1) return 1; return num(n-1)+n;}num(100);
- cocos2dx 3.17.1 导演类
进入导演类的头文件,首先看到的是一些头文件的引用:CCPlatformMacros(适配),CCRef(继承的父类),CCVector(3.0以后的新向量),CCScene(场景),CCMath(数学 ...
- .Net Core+Angular6 学习 第一部分(创建web api)
. 创建.net core web api 1.1 选择一个empty 模式,里面只有简单的2个class 1.2 配置web api 的路由. 1.2.1 打开Startup.cs,首先引用conf ...
- 最近学习的 Node.js 基础:安装、环境配置、forever
最近工作中,因为某某某某原因,需要用到Node.js . 发现在很多方面和python很像,比如generator / yield ,比如模块的使用方式,比如http模块. 先安装个环境,windo ...
- @Schedule注解中的Cron表达式读取properties的方法
1.properties文件中增加配置项: datasync.cron=0 */10 * * * ? 2.定时任务类增加PropertySource注解: @PropertySource(" ...
- JavsScript学习---快速排序
<script type="text/javascript"> /** * “快速排序”的思想很简单,整个排序过程只需要三步: * (1)在数据集之中,找一个基准点 * ...
- 本地操作功能 --local_action
Ansible 默认只会对控制机器执行操作,但如果在这个过程中需要在 Ansible 本机执行操作呢?细心的读者可能已经想到了,可以使用 delegate_to( 任务委派 ) 功能呀.没错,是可以使 ...
- UITextField属性及方法说明
/初始化textfield并设置位置及大小 UITextField *text = [[UITextField alloc]initWithFrame:CGRectMake(, , , )] //设置 ...