C语言中的volatile
1.volatile有什么含义?有什么用法?官方定义是: 一个变量也许会被后台程序改变。 关键字volatile与const绝对独立。它指示一个变量也许会被某种方式修改,这种方式按照正常程序流程分析是无法预知的(例如,一个变量也许会被一个中断服务程序所修改)。这个关键字使用以下语法定义: ? volatile data-defiinition; 注:变量如果加了voletile修饰,则会从内存中重新装载内容,而不是直接从寄存器中拷贝内容。 ? 2.编译器的优化 当变量因别的线程值发生改变,上面寄存器的值不会相应改变,从而造成应用程序读取的值和实际的变量值不一致。 3.常见的问题(1)说明关键字volatile有什么含意,并给出例子。 ? ? (3)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 就是在此种情况下使用。?? (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |