理解C语言中的volatile变量

3

我现在正在课堂上学习C语言,但是我对于volatile变量的理解有些困惑。我的教材(计算机编程,作者Ajay K. Mittal、Ashok N. Kamthane和Anita Goel)对其进行了如下定义:

volatile变量

volatile变量是指那些被其他外部程序或同一程序随时更改的变量。其语法如下。

volatile int d;

普通变量和volatile变量之间到底有什么区别呢?如果volatile变量可以被外部程序更改,那么我该如何在另一个外部程序中更改它的值呢?


6
一般来说,嵌入式系统中会使用易变变量。这是为了告诉编译器这些变量可能会发生改变;编译器对于易变变量不适用于普通变量的假设。 - Charlie Burns
你可能想要查看: https://dev59.com/zXI-5IYBdhLWcg3wy76n - Sinn
2个回答

10

volatile关键字告诉编译器变量可以被更改(听起来毫无意义),因此在优化时应当小心。例如,考虑以下情况-

bool running = true;
while(running) {
    //do something
}

编译器可能会将while(running)更改为while(1),但如果变量running受到while循环外的代码(例如多线程)的影响,这将创建一个非常难以发现的错误。因此,正确的做法是将running声明为volatile
volatile bool running = true;
while(running) {
    //do something
}

2
在多线程中,您可以在 running 周围使用条件变量或互斥锁。这些构造可能使用 volatile 实现,也可能不使用,但它并不是一个真正的用户级工具。 - Potatoswatter

9

volatile表明用于存储对象的字节可能会被程序中其他并行运行的东西更改或访问。实际上,这通常是硬件接口,但有时也用于与操作系统进行接口。

const表示内存是只读的(对于您的程序而言),volatile表示某些其他任务可以写入它。 const volatile一起表示一个对象代表硬连线输入;您可能会在带有内存映射传感器的微控制器中看到这样的东西。

这将如何影响您的程序是编译器特殊处理对内存的访问。如果您访问两次,编译器不会缓存第一次访问并给您两次相同的值。它将转到内存硬件并执行两个读取操作。当您修改对象时,该修改立即按照您指定的精确方式写入,没有缓冲或重新排序优化。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接