【C】volatile
volatile
是一个C/C++关键字,它用于告诉编译器当前变量是易变的,需要在每次使用时都从内存中重新获取值,而不是使用缓存中的旧值。
一般来说,对于定义在函数中的自动变量,编译器会尽量利用寄存器来提高访问速度,这样就会使得该变量的值可能被缓存起来,不一定会立即被写入内存。如果这时候要访问这个变量的值,就可能会出现错误的结果。特别是在并发编程或者嵌入式开发等场景下,可能会对内存进行随时修改,此时使用volatile
关键字就可以防止出现这种错误。
使用volatile
关键字时需要注意,它仅仅告诉编译器该变量是易变的,不应该使用寄存器来存储其值,但并不保证进程访问该变量的正确性,仍然需要考虑对多线程的并发安全问题,要遵循原子操作和加锁等操作。
此外,volatile还有阻止程序优化的作用。
在 C/C++ 中,volatile
关键字用于告诉编译器某个变量可能会在程序的外部被修改,从而避免编译器对该变量进行过度的优化。
如果没有使用 volatile
,编译器可能会认为某个变量的值在整个程序执行期间都没有发生变化,从而对其进行优化,如将其存储在寄存器中,直接使用寄存器中的值而不是读取该变量的实际值。但如果该变量是被其他线程或硬件设备修改的(例如一个硬件 I/O 寄存器的值),那么编译器的优化可能会导致程序出错。
因此,使用 volatile
关键字可以告诉编译器,该变量的值是不稳定的,可能会在程序执行期间被修改,编译器必须每次读取该变量的实际值而不是使用寄存器中的旧值。
需要注意的是,volatile
并不能保证线程安全或原子性,它只能避免编译器对该变量的过度优化,而并不能保证其他线程或硬件设备对其的修改操作。如果需要保证线程安全和原子性,通常需要使用更高级别的同步原语,例如互斥锁、条件变量、原子变量等。