我现在正在课堂上学习C语言,但是我对于volatile变量的理解有些困惑。我的教材(计算机编程,作者Ajay K. Mittal、Ashok N. Kamthane和Anita Goel)对其进行了如下定义:
volatile变量
volatile变量是指那些被其他外部程序或同一程序随时更改的变量。其语法如下。
volatile int d;
普通变量和volatile变量之间到底有什么区别呢?如果volatile变量可以被外部程序更改,那么我该如何在另一个外部程序中更改它的值呢?
我现在正在课堂上学习C语言,但是我对于volatile变量的理解有些困惑。我的教材(计算机编程,作者Ajay K. Mittal、Ashok N. Kamthane和Anita Goel)对其进行了如下定义:
volatile变量
volatile变量是指那些被其他外部程序或同一程序随时更改的变量。其语法如下。
volatile int d;
普通变量和volatile变量之间到底有什么区别呢?如果volatile变量可以被外部程序更改,那么我该如何在另一个外部程序中更改它的值呢?
volatile
关键字告诉编译器变量可以被更改(听起来毫无意义),因此在优化时应当小心。例如,考虑以下情况-
bool running = true;
while(running) {
//do something
}
while(running)
更改为while(1)
,但如果变量running
受到while循环外的代码(例如多线程)的影响,这将创建一个非常难以发现的错误。因此,正确的做法是将running
声明为volatile
。volatile bool running = true;
while(running) {
//do something
}
running
周围使用条件变量或互斥锁。这些构造可能使用 volatile
实现,也可能不使用,但它并不是一个真正的用户级工具。 - Potatoswattervolatile
表明用于存储对象的字节可能会被程序中其他并行运行的东西更改或访问。实际上,这通常是硬件接口,但有时也用于与操作系统进行接口。
而const
表示内存是只读的(对于您的程序而言),volatile
表示某些其他任务可以写入它。 const volatile
一起表示一个对象代表硬连线输入;您可能会在带有内存映射传感器的微控制器中看到这样的东西。
这将如何影响您的程序是编译器特殊处理对内存的访问。如果您访问两次,编译器不会缓存第一次访问并给您两次相同的值。它将转到内存硬件并执行两个读取操作。当您修改对象时,该修改立即按照您指定的精确方式写入,没有缓冲或重新排序优化。