C语言 volatile 关键字总结

对 volatile 关键字的理解:

  • volatile在英语的意思是:挥发性的, 不稳定的, 易变的. 在编程中不是是很容易被理解的它, 加上平常很少被用到, 再加上它更多地被用于硬件编程方面, 所以就更加让一些人琢磨不透了.
  • 总之, 作为一个变量类型修饰符, volatile的作用就是被设计用来修饰被不同线程访问和修改的变量. 在原子操作中同样会用到. 如果没有它, 很有可能使得编程写的多线程程序出现不可预期的错误, 也可能因为编译器的各种优化而导致编译后的结果表达了不同的意思, 使得程序出现难以发现的错误.
  • 被volatile修饰的变量是说这个变量可能会被意想不到地被改变, 这样, 编译器就不会在编译会访问该变量的语句的时候, 依然使用保存在某个寄存器的值来加快速度, 取而代之的是, 每次都从该变量的原始地址处重新读取该变量的值, 这样就能使得取到的值总是是”最新”的, 真正意义上的最新. 区别在于:如果编译器在编译涉及到访问某个变量的值的时候, 它会把被频繁访问的变量保存到CPU的寄存器中供复用, 以加快再次访问变量的速度. 但是, 该值是从CPU的寄存器中取出的, 它虽然是最原始的值, 但如果在其它时间, 其它地点的程序如果修改了该变量的值, 那么编译器拿到的值就是一个”过时”的值, 这样就会出现错误. 其它时间可以是CPU的线程调度, 其它地点可以是另一个线程的代码.

下面看一段代码:

#include <stdio.h>

int main()
{
    const int num = 10;
    int *p = (int *)&num;
    *p = 20;
    printf("num = %d\n", num);
    return 0;
}

这里写图片描述

#include <stdio.h>

int main()
{
    volatile const int num = 10;
    int *p = (int *)&num;
    *p = 20;
    printf("num = %d\n", num);
    return 0;
}

这里写图片描述

总结:
1.作用:编译时不优化,执行时不缓存,每次需从内存中读出(保证内存的可见性)。
2.使用场景:用于多线程或多CPU编程。

猜你喜欢

转载自blog.csdn.net/t595180928/article/details/80449055