`
yangyou230
  • 浏览: 1683516 次
文章分类
社区版块
存档分类

关键字volatile的作用

 
阅读更多

编译器优化的时候可能会出现问题,在本次线程内,当读取一个变量时,为提高存取速度,编译器优化时有时会先把变量读取到一个寄存器中;以后,再取变量值时,就直接从寄存器中取值;当变量值在本线程里改变时,会同时把变量的新值copy到该寄存器中,以便保持一致。当变量在因别的线程等而改变了值,该寄存器的值不会相应改变,从而造成应用程序读取的值和实际的变量值不一致,当该寄存器在因别的线程等而改变了值,原变量的值不会改变,从而造成应用程序读取的值和实际的变量值不一致。

对于volatile类型的变量,系统每次用到它的时候都是直接从对应的内存当中提取,而不会利用cache当中的原有数值,以适应它的未知何时会发生的变化,系统对这种变量的处理不会做优化——显然也是因为它的数值随时都可能变化的情况。

volatile是一个类型修饰符(type specifier)。它是被设计用来修饰被不同线程访问和修改的变量。如果没有volatile,基本上会导致这样的结果:要么无法编写多线程程序,要么编译器失去大量优化的机会。

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

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

2).一个中断服务子程序中会访问到的非自动变量 (Non-automaticvariables)。它和一个外部设备的某个状态对应,当外部设备发生操作的时候,通过驱动程序和中断事件,系统改变了这个变量的数值,而程序并不知道。

3).多线程应用中被几个任务共享的变量。

以下是对3个问题的解答。

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

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

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

intsquare(volatileint*ptr)

{

return*ptr**ptr;

}

下面是答案:

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

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

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

intsquare(volatileint*ptr)

{

inta,b;

a=*ptr;

b=*ptr;

returna*b;

}

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

longsquare(volatileint*ptr)

{

inta;

a=*ptr;

returna*a;

}

程序实例如下:

有一个变量T,在定时中断中每隔一个固定时间减一,然后在主程序中等待它减到0

正确的写法应该是将第一句改为:

volatileunsignedcharT;

分享到:
评论

相关推荐

    C语言中关键字volatile的作用

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

    java volatile 关键字实战

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

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

    在C语言中,关键字volatile是一个非常重要的修饰符,它在程序设计中起着不可替代的作用。volatile的主要目的是告诉编译器,它所修饰的变量是易变的,可能会在程序的控制之外被改变。因此,编译器在优化代码时,不能...

    关键字volatile的用途

    ### 关键字volatile的用途 #### 一、volatile的基本概念 在嵌入式系统开发过程中,程序员经常会遇到一些变量的值可能会被意外修改的情况。这些情况可能是由硬件操作、多线程并发执行或是中断服务程序导致的。为了...

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

    "C语言关键字volatile(易变的)表示不经过赋值,其值也可能被改变" C语言关键字volatile(易变的)是一种特殊的关键字,用于告诉编译器,该变量的值可能会在程序执行期间发生变化,甚至在不经过赋值的情况下。这种...

    Java关键字volatile和synchronized作用和区别

    Java关键字volatile和synchronized作用和区别 Java关键字volatile和synchronized是Java语言中两个常用的关键字,它们都是用来解决多线程编程中的同步问题的,但它们的作用和用法却有所不同。 volatile关键字是变量...

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

    volatile 的意思是“易失的,易改变的”。...关键字volatile有什么含意?并给出三个不同的例子。 一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。

    Java 关键字 volatile 的理解与正确使用

    Java 关键字 volatile 的理解与正确使用 Java 语言中关键字 volatile 被称作轻量级的 synchronized,与 synchronized 相比,volatile 编码相对简单且运行时的开销较少,但能够正确合理地应用好 volatile 并不是那么...

    何为C语言关键字volatile

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

    Java中的关键字volatile详解

    Java中的关键字volatile详解 一、volatile关键字原理 在Java中,volatile关键字经常用来修饰变量。volatile关键字的作用是使变量在多个线程之间可见。volatile关键字可以保证变量的可见性,但不能保证变量的原子性...

    c语言关键字volatile

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

    Java中volatile关键字的含义

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

    C语言中关键字volatile的用法

    C语言中关键字volatile的用法 摘要:本文详细介绍了C语言中关键字volatile的用法、注意事项和注意点,包括volatile关键字的定义、用法、优化器对volatile变量的处理、volatile变量的例子、volatile关键字的含义,...

    单片机C语言中volatile的作用

    在探讨单片机C语言中`volatile`关键字的作用之前,我们首先需要理解`volatile`的基本概念及其应用场景。`volatile`是一个用于声明变量的关键字,在C语言中,使用`volatile`修饰的变量表明其值可能会在没有程序控制的...

    Java中volatile关键字的作用与用法详解

    Java中的`volatile`关键字是一个非常重要的并发编程工具,它的作用主要体现在两个方面:**可见性**和**有序性**。本文将深入解析`volatile`的关键字特性及其在实际编程中的应用。 1. 可见性: 当一个共享变量被`...

    详解C中volatile关键字

    volatile关键字的作用是提醒编译器它后面所定义的变量随时都有可能改变,因此编译后的程序每次需要存储或读取这个变量的时候,都会直接从变量地址中读取数据。如果没有volatile关键字,则编译器可能优化读取和存储,...

    EDA/PLD中的何为C语言关键字volatile

    `volatile` 关键字的作用是告诉编译器,变量的值可能会在程序运行过程中被外界不可预见的因素(例如硬件交互、中断服务程序等)改变,因此编译器不应对这类变量进行优化,每次使用时都应该从内存中重新读取其值。...

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

    `volatile` 关键字的作用主要体现在以下几个方面: 1. **多线程编程**:在多线程环境中,当一个变量可能被多个线程同时访问和修改时,使用`volatile` 可以确保每个线程都能看到其他线程对这个变量的最新修改。...

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

    ### Java并发编程:volatile关键字解析 #### 一、内存模型的相关概念 在深入了解`volatile`关键字之前,我们首先需要理解计算机内存模型的一些基本概念。在现代计算机系统中,CPU为了提高执行效率,会将频繁访问的...

Global site tag (gtag.js) - Google Analytics