C++ volatile类型修饰符(type specifier), 多线程

原创 2016年08月29日 15:57:37

volatile是被设计用来修饰被不同线程访问和修改的变量

volatile的作用是: 作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值.

一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。

以上内容摘自百度百科

但请注意 : volatile不是用来解决多线程竞争问题的

https://www.zhihu.com/question/31459750/answer/52069135知乎上的解释

#include <stdlib.h>
#include <iostream>
#include <list>
#include <conio.h>
#include <time.h>
#include <algorithm>
#include <windows.h>
//头文件引用较多, 有一些与本程序无关

using namespace std;

int main(int argc, char* argv[])
{
	volatile int i = 10;
    cout << "i = " << i << endl;

    //下面汇编语句的作用就是改变内存中i的值,但是又不让编译器知道
    __asm
    {
        mov dword ptr[ebp-4],20h//把32赋给i, 16进制的20转为10进程是32
    }

    cout << "i = " << i << endl;

	system("pause");
	return 0;
}
运行结果(注意在VS2010中要把运行模式改为Release):

i = 10

i = 32

如果i没被volatile修饰的话, i的值不会改变

版权声明:本文为博主原创文章,未经博主允许不得转载。

C/C++中volatile的用法

volatile是“易变的”、“不稳定”的意思。volatile是C/C++的一个较为少用的关键字,它用来解决变量在“共享”环境下容易出现的读取错误的问题。...

c++ volatile用法

volatile关键字 volatile是c/c++中一个鲜为人知的关键字,该关键字告诉编译器不要持有变量的临时拷贝,它可以适用于基础类型 如:int,char,long......也适用...

C/C++中存储类型修饰符的区别(auto、static、register、extern、volatile、restrict)

一、局部变量和全局变量: (1)局部变量:局部变量也叫自动变量,它声明在函数开始,生存于栈,它的生命随着函数的返回而结束。 #include int main(void) { au...

C语言类型修饰符 在这个上边吃大亏了啊 volatile

今天调试程序的时候出了一个非常奇怪的bug,令我百思不得其解,最后还是我的项目经理给我指出问题所在,原来是volatile 在搞鬼 所以痛下决心弄明白这些陷阱。 编译器会对程序进行优化,在某些情况...

类型修饰符volatile关键字

volatile关键字是一种类型修饰符,用它声明的类型变量表示可以被某些编译器未知的因素更改,比如:操作系统、硬件或者其它线程等。遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而...

类型修饰符Volatile 以及字符串函数strrchr

类型修饰符Volatile 以及字符串函数strrchr就像大家更熟悉的const一样,volatile是一个类型修饰符(type specifier)。它是被设计用来修饰被不同线程访问和修改的变量。...

C++储存类型修饰符

  • 2016年04月07日 17:08
  • 4KB
  • 下载

C++中各种类型修饰符汇总

explicit C++中, 一个参数的构造函数(或者除了第一个参数外其余参数都有默认值的多参构造函数), 承担了两个角色。 1 是个构造器 ,2 是个默认且隐含的类型转换操作符。 所以, 有...
  • lylyyg
  • lylyyg
  • 2015年08月13日 09:51
  • 1599

c#中多线程修饰符volatile

volatile是C#中用于控制同步的关键字,其意义是针对程序中一些敏感数据,不允许多线程同时访问,保证数据在任何访问时刻,最多有一个线程访问,以保证数据的完整性,volatile是修饰变量的修饰符。...

register 类型修饰符

register:这个关键字请求编译器尽可能的将变量存在CPU内部寄存器中,而不是通过内存寻址访问,以提高效率。注意是尽可能,不是绝对。你想想,一个CPU 的寄存器也就那么几个或几十个,你要是定义...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++ volatile类型修饰符(type specifier), 多线程
举报原因:
原因补充:

(最多只允许输入30个字)