volatile关键字

volatile

介绍

volatile 关键字和 const 对应,用来修饰变量,通常用于建立语言级别的 memory barrier。

volatile 关键字是一种类型修饰符,告诉编译器用它声明的类型变量会被某些编译器未知的因素更改,那么编译后不应该从寄存器中读取变量的值,而是直接从内存中读取(显然,读取内存的效率会低于读取寄存器)

重要性

对于嵌入式开发非常重要!!!

(如果降低 / 关闭编译器优化,有可能不会出错,但“有可能”这三个字本身就不安全)

比如:

  1. 某变量没有被明显指明修改

    #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);
    }
    
  2. 多线程(任务)下对同一变量修改

    // 变量定义
    volatile  BOOL  bStop  =  FALSE;
    
    // 线程1
    while(  !bStop  ); // 等待线程2修改bStop
    bStop  =  FALSE;  
    return;    
    
    // 线程2
    bStop  =  TRUE;
    while(  bStop  );  //等待上面的线程终止,如果bStop不使用volatile申明,那么这个循环将是一个死循环,因为bStop已经读取到了寄存器中,寄存器中bStop的值永远不会变成FALSE,加上volatile,程序在执行时,每次均从内存中读出bStop的值,就不会死循环了。
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值