`
ai_longyu
  • 浏览: 480709 次
社区版块
存档分类
最新评论

关键字volatile有什么含意?并给出三个不同的例子

 
阅读更多

关键字volatile有什么含意?并给出三个不同的例子。

一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。

下面是volatile变量的几个例子:

1). 并行设备的硬件寄存器(如:状态寄存器)

2). 一个中断服务子程序中会访问到的非自动变量(Non-automatic variables)

3). 多线程应用中被几个任务共享的变量 回答不出这个问题的人是不会被雇佣的。我认为这是区分C程序员和嵌入式系统程序员的最基本的问题。嵌入式系统程序员经常同硬件、中断、RTOS等等打交道,所用这些都要求volatile变量。不懂得volatile内容将会带来灾难。

假设被面试者正确地回答了这是问题(嗯,怀疑这否会是这样),我将稍微深究一下,看一下这家伙是不是直正懂得volatile完全的重要性。

1). 一个参数既可以是const还可以是volatile吗?解释为什么。

2). 一个指针可以是volatile 吗?解释为什么。

3). 下面的函数有什么错误:

int square(volatile int *ptr) {

return *ptr * *ptr;

}

下面是答案:

1). 是的。一个例子是只读的状态寄存器。它是volatile因为它可能被意想不到地改变。它是const因为程序不应该试图去修改它。

2). 是的。尽管这并不很常见。一个例子是当一个中服务子程序修该一个指向一个buffer的指针时。

3). 这段代码的有个恶作剧。这段代码的目的是用来返指针*ptr指向值的平方,但是,由于*ptr指向一个volatile型参数,编译器将产生类似下面的代码:

int square(volatile int *ptr) {

int a,b;

a = *ptr;

b = *ptr;

return a * b;

}

由于*ptr的值可能被意想不到地该变,因此a和b可能是不同的。结果,这段代码可能返不是你所期望的平方值!

正确的代码如下:

long square(volatile int *ptr) {

int a;

a = *ptr;

return a * a;

}

Volatile 关键字告诉编译器不要持有变量的临时性拷贝。一般用在多线程程序中,以避免在其中一个线程操作该变量时,将其拷贝入寄存器。

请看以下情形: A线程将变量复制入寄存器,然后进入循环,反复检测寄存器的值是否满足一定条件(它期待B线程改变变量的值。

在此种情况下,当B线程改变了变量的值时,已改变的值对其在寄存器的值没有影响。所以A线程进入死循环。

volatile 就是在此种情况下使用。

分享到:
评论

相关推荐

    探讨C语言中关键字volatile的含义

    volatile 的意思是“易失的,易改变的”。这个限定词的含义是向编译器指明变量的内容...并给出三个不同的例子。 一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。

    经典嵌入式笔试题

    并给出三个不同的例子。 一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而...

    C语言中关键字volatile的作用

    C语言中关键字volatile的作用,使用说明和例子

    java volatile 关键字实战

    java volatile 关键字实战java volatile 关键字实战java volatile 关键字实战java volatile 关键字实战java volatile 关键字实战java volatile 关键字实战java volatile 关键字实战java volatile 关键字实战java ...

    4.4 volatile关键字有什么作用?.rar

    GD32F303各种使用场景代码实现

    关键字volatile的用途

    在嵌入式编程中,经常会遇到编译器优化问题,对关键字volatile的应用也很频繁,但是绝大多数人都不清楚它的意义与原因,本文将做一个详细介绍

    C语言中关于关键字volatile的用法

    作为指令关键字,volatile的作用是确保本条指令不会因编译器的优化而省略,且要求每次直接读值。下面来一一说明

    IOS面试题归总

    并给出三个不同例子? static作用 #import和#include的区别,@class代表什么 线程和进程的区别? 堆和栈的区别? Object-C的内存管理? 为什么很多内置的类,如TableViewController的delegate的属性是assign不是...

    何为C语言关键字volatile

    在程序员面试宝典中提到“关键字volatile的面试例题是考查嵌入式编程”,中间有一段解析:  回答不出这个问题的人是不会被雇佣的。我认为这是区分C程序员和嵌入式系统程序员的基本的问题。搞嵌入式的家伙们经常同...

    volatile关键字 Const关键字 static关键字 mutable 关键字

    C/C++ 嵌入式 一些关键字: volatile关键字 Const关键字 static关键字 mutable 关键字

    Java并发编程:volatile关键字解析

    Java并发编程:volatile关键字解析

    详解C中volatile关键字

    一个生动的例子,详解了Volatile关键字对变量的声明在不同编译环境下可能造成不同的结果

    全面解析《嵌入式程序员应该知道的16个问题》

    全面解析《嵌入式程序员应该知道的16 个问题》 ...1、预处理器(Preprocessor)... 1 2、如何定义宏......7、关键字const 有什么含意?... 7 8、Volatile 的使用... 9 9、位操作(Bit manipulation)... 12 10

    c语言关键字volatile

    嵌入式系统开发中,经常用到volatile 和const关键字,本文针对这2个关键字的基本用法,进行讲解

    C语言关键字volatile(易变的)表示不经过赋值,其值也可能被改变

    C语言关键字volatile(易变的)表示不经过赋值,其值也可能被改变

    volatile关键字使用

    详细描述关于votatile关键字使用,可以帮助你加深对volatile关键字的理解和使用。

    你了解C语言中的关键字volatile吗?

    我们在学习C语言的32个关键字时,大家都不太注意volatile这个关键字,volatile是一个类型修饰符。volatile的中文意思是“易变的”。那么在程序中我们在什么情况下才使用他呢?我们在分析内核时经常看到这个关键字的...

    Java线程:volatile关键字

    主要讲述java线程volatile关键字

    Java中volatile关键字的含义

    在java线程并发处理中,有一个关键字volatile的使用目前存在很大的混淆,以为使用这个关键字,在进行多线程并发处理的时候可以万事大吉。  Java语言是支持多线程的,为了解决线程并发的问题,在语言内部引入了 ...

    java volatile 关键字 学习

    java volatile 关键字 学习

Global site tag (gtag.js) - Google Analytics