volatile 关键字

volatile关键字在编程中,尤其是在C和C++语言中,用于指示编译器一个变量可能会在程序的执行期间被意外的更改,因此每次使量的时候都必须从原始的内存位置读取它的值,而不是使用缓存中的值。这个关键字提醒编译器不要对这个变量的读取和写入优化,以保证程序运行的正确性。

使用场景

1.并发多线程访问的变量:在多线程编程中,如果一个变量可能被一个以上线程同时访问和修改,则应该将该变量声明为volatile。
由于不同线程可能在自己的工作内存中缓存变量副本, volatile关键字确保每次访问该变量时,都是直接从原始内存中读取,从而避免数据的不一致性。
2. 内存映射的硬件寄存器:当与硬件打交道时,变量可能映射到某个硬件寄存器。
这些寄存器的内容可能随时发生变化,此时使用volatile可以防止编译器优化对这些变量的访问。

volatile int flag = 0; // 假设这是一个被多个线程或中断访问的变量

void someFunction() {   while(flag == 0)                                                                                            {//等待 flag 被其他线程或中断服务程序改变
}                        //... 继续执行 ...}

volatile 声明变量是容易被修改的 ,他可以使变量在优化编译的时候不会把该变量修改成别的内容

volatile 的使用场景

1、并发多线程环境

在多线程编译中,多个线程使用同一个变量,并且最少有一个线程会修改变量的值,那这个变量就声明为volatile,由于不同线程可能在各自的工作内存(缓存)拥有该变量的副本,volatile确保直接从原始地址读取变量确保线程之间的可见性。

2、内存映射的硬件寄存器

当变量映射到某个硬件设备的寄存器,这些寄存器的内容可能被外部设备随时修改,使用volatile可以防止编译器优化对这些变量访问,确保每次访问都是直接读取硬件寄存器。

volatile uint32_t*  const WB = (uint32_t *)0x12345678;// uint32_t* const 指针变量 确保指针变量地址(内容)不会被指针直接修改 

3、中断服务程序

在中断驱动的程序中,中断服务程序(ISR)可能会改变变量的值,而主程序也会访问这些变量,因为这些变量是不可预测的,所以声明这些变量为volatile

4、DMA和类似操作

在涉及直接内存访问(DMA)的操作下,硬件会与内存直接交互,可能会更改通过DMA交互映射的变量的值

你可能感兴趣的:(c语言)