volatile
介绍
volatile 关键字和 const 对应,用来修饰变量,通常用于建立语言级别的 memory barrier。
volatile 关键字是一种类型修饰符,告诉编译器用它声明的类型变量会被某些编译器未知的因素更改,那么编译后不应该从寄存器中读取变量的值,而是直接从内存中读取(显然,读取内存的效率会低于读取寄存器)
重要性
对于嵌入式开发非常重要!!!
(如果降低 / 关闭编译器优化,有可能不会出错,但“有可能”这三个字本身就不安全)
比如:
-
某变量没有被明显指明修改
#include <stdio.h> void main() { int i = 10; int a = i; printf("i = %d", a); // 下面汇编语句的作用就是改变内存中 i 的值 // 但是又不让编译器知道 __asm { mov dword ptr [ebp-4], 20h } int b = i; printf("i = %d", b); }
-
多线程(任务)下对同一变量修改
// 变量定义 volatile BOOL bStop = FALSE; // 线程1 while( !bStop ); // 等待线程2修改bStop bStop = FALSE; return; // 线程2 bStop = TRUE; while( bStop ); //等待上面的线程终止,如果bStop不使用volatile申明,那么这个循环将是一个死循环,因为bStop已经读取到了寄存器中,寄存器中bStop的值永远不会变成FALSE,加上volatile,程序在执行时,每次均从内存中读出bStop的值,就不会死循环了。