volatile_conceivable

admin 28 0

如何理解volatile和const

在C语言中,const的意思是“一个不能被改变的普通变量”,它总是占用存储空间而且它的名字是全局的。C编译器不能把const堪称一个编译器间的常量。所以在C中你可以这么写:const int bufsize;//不赋值。但不能这么写:cosnt bufsize = 100;char buf[bufsize]; //因为bufsize不是常量。

volatile关键字是一种类型修饰符,用它声明的类型变量表示可以被某些编译器未知的因素更改,比如:操作系统、硬件或者其它线程等。由于访问寄存器的速度要快过RAM,所以编译器一般都会作减少存取外部RAM的优化。

const 指定了我们的程序代码中是不可以改变这个变量的,但是我们不能保证,由于硬件的原因,导致这个值被改变。volatile 关键字表示,编译器进行强制 I/O 寻址,而非读取寄存器的值。

我的理解:const被编译器优化了,变成了常量。

const表示不能写入,只读;volatile表示该变量的值会随时变化。主要是共编译程序优化,检查是用。如果对const变量进行写操作,会报错。对于有些接口地址,值会被设备修改,因此,连续两次读取,数值也可能不同。

一个参数既可以是const还可以是volatile吗?可以的,例如只读的状态寄存器。它是volatile因为它可能被意想不到地改变。它是const因为程序不应该试图去修改它。2) 一个指针可以是volatile 吗?可以,当一个中服务子程序修该一个指向一个buffer的指针时。

volatile怎么读

1、volatile的读音为:[vltal]。volatile是一个特征修饰符(type specifier)。volatile的作用是作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值。

2、volatile可利用谐音进行记忆。谐音记忆:音标: 【vltal】,谐音“无来头”,反复无常的,易变的;动荡不定的。

3、volatile的本意是“易变的”,不过翻译成“直接存取原始内存地址”更为合适。“易变”是因为外在因素引起的,象多线程,中断等,并不是因为用volatile修饰了的变量就是“易变”了,假如没有外因,即使用volatile定义,它也不会变化。

4、若提斯波儿,哇力戴特,我来台儿。个人不建议你用此方法学习英语,英语应该从音标开始学,打好基础才能学好,利用这种投机取巧的方法是学不好英语的。

5、volatile修饰的成员变量在每次被线程访问时,都强迫从共享内存中重读该成员变量的值。而且,当成员变量发生变化时,强迫线程将变化值回写到共享内存。这样在任何时刻,两个不同的线程总是看到某个成员变量的同一个值。

6、volatile 关键字告诉编译器该变量可能会在程序的任意时刻被改变,不应该被优化或缓存,每次访问该变量时都应该从内存中读取。在多线程程序中,如果一个变量可能被多个线程同时访问和修改,那么就应该将其声明为 volatile,以确保每个线程都能看到该变量的最新值。

C++中的volatile是什么意思?

volatile的本意是一般有两种说法--“暂态的”;“易变的”。这两种说法都有可行。但是究竟volatile是什么意思,现举例说明(以Keil-c与a51为例 例子来自Keil FQA),看完例子后你应该明白volatile的意思了,如果还不明白,那只好 再看一遍了。

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

volatile的本意是“易变的”,不过翻译成“直接存取原始内存地址”更为合适。“易变”是因为外在因素引起的,象多线程,中断等,并不是因为用volatile修饰了的变量就是“易变”了,假如没有外因,即使用volatile定义,它也不会变化。

volatile可以保证原子性吗

被volatile修饰的变量保证的是可见性,不是原子性。这是两个不同的概念。可见性是指不论在哪个线程中看,同一个对象同一时刻的值总是一样的,不会出现不一致的情况。原子性是指一个操作要么完成,要么没有完成,不会出现完成了一半的情况。

化学爆炸是断裂分子键来释放能量,总物质不变。原子弹是将质量转换成能量,质量损失。

因为volatile并不能保证其原子性,他只保证了某一个线程对他修改以后其他线程可见,尤其是当多个线程对一个变量自增活自减时会导致变量出错。参照《深入理解java虚拟机》一书,volatile运用在以下场景:1运算结果并不依赖变量的当前值,或者能够确保只有单一的线程修改变量的值。

volatile具有可见性、有序性,不具备原子性。注意,volatile不具备原子性,这是volatile与java中的synchronized、java.util.concurrent.locks.Lock最大的功能差异,这一点在面试中也是非常容易问到的点。下面来分别看下可见性、有序性、原子性:原子性:如果你了解事务,那这个概念应该好理解。

这里面就有一个误区了,volatile关键字能保证可见性没有错,但是上面的程序错在没能保证原子性。可见性只能保证每次读取的是最新的值,但是volatile没办法保证对变量的操作的原子性。 在前面已经提到过,自增操作是不具备原子性的,它包括读取变量的原始值、进行加1操作、写入工作内存。

// 证明 long 变量简单操作(赋值和返回)不具有原子性,存在字撕裂问题。验证 volatile 可确保// long 变量简单操作具有原子性。

标签: #volatile