跳至内容
深圳市捷比信实业有限公司 · 产品选型与采购咨询联系业务人员
合金电阻捷比信 · 专业器件主题站

什么时候需要使用volatile关键字

我以前一定见过volatile关键字,但是您知道何时需要使用volatile关键字吗?直接看下面的代码:int a = 100; while(a == 100){//代码}编译该程序时,如果编译器发现该程序从不尝试更改a的值,则可以对此进行优化。 code,while(true)的无限循环使程序执行得更快。但是,这种优化有时会变得过度优化。有时,编译器可能没有意识到程序会更改a的值,但是进行了这种优化。结果,程序没有产生预期的行为。为了产生预期的行为,需要防止编译器执行此优化。您可以使用volatile关键字进行修改。挥发性整数a = 100; volatile关键字对应于const关键字。 const关键字告诉编译器修改后的变量是只读的。编译器根据只读属性执行一些操作,而volatile关键字则告诉编译器对其进行修改。的变量是可变的。同样,编译器将基于changeable属性执行一些操作。这样可以确保每次读取修改后的变量时都从内存中读取该变量,并且每次写入后将其值写入内存中。 volatile关键字提醒编译器,告诉编译器不要过度优化修改后的变量,并提醒编译器可以通过其他方式更改变量的值。当volatile修改结构时,该结构的成员也是volatile结构A {int data;}; volatile A a; const A b;答案是结构中的所有内容都是易变的。引用C ++标准中的一句话:[注:volatile是实现的一种提示,以避免涉及对象的积极优化,因为对象的值可能通过实现无法检测到的方式进行更改。有关详细的语义,请参见1.9。通常,volatile的语义在C ++中与在C中是相同的。]在这里可以粗略地理解一个对象是volatile,并且该对象的所有成员也是volatile。实际上,const和volatile可以理解为硬币的两面。我们经常听到并看到传奇的CV修饰符是const和volatile关键字。挥发物能保证原子性吗?我想每个人都知道答案。易失性仅保证内存可见性,而不能保证操作是原子性的。以i ++为例:volatile int i = 0; i ++; // i = i + 1 i ++ 等效于i = i + 1,实际上i = i + 1可以分解为几个步骤:首先将i的值读取到tmp,增加tmp的值,然后将tmp的值写回到i的地址。易失性只能保证内存可见,可以理解的是,上述三个步骤中的每个步骤都是原子的,但是结合起来时这三个步骤不一定是原子的,因为在多线程中这三个步骤的中间可能会插入一些其他操作要更改预期的行为,因此Volatile无法在多线程中使用,并且多线程中的原子操作仍然需要使用原子。这个原理就是为什么单例模式的双重检查方法中的实例变量需要通过volatile进行修改的原因。小摘要提示:volatile无法解决多线程安全性问题。只有特殊存储才需要挥发性。它具有原子的特性如下:•&std :: atomic用于由多个线程访问的数据,而不会相互排斥。并发编程•非易失性用于无法针对读写操作进行优化的内存,并用于特殊的内存参考资料https://stackoverflow.com/questions/4437527/why-do-we-use- volatile关键字https://stackoverflow.com/questions/72552/why-does-volatile-exist https://stackoverflow.com/questions/4479597/does-making-a-struct-volatile-make-all-its- Members-volatile / 4479652 https://stackoverflow.com/questions/19744508/volatile-vs-atomic https://blog.csdn.net/bdss58/article/details/44813597 c ++ 11新功能,所有知识点都是这里 !您的C ++小组还在禁用异常处理吗?内存对齐格式修订版C ++ 11新功能智能指针gcc a.c经历了什么?讨论程序链接和分段