volatile和amp;有什么区别? extern关键字?

时间:2012-02-07 09:04:20

标签: c embedded volatile

几天前我接受了采访,但仍然在寻找答案。 我想了解使用volatile关键字的重要性。

找到以下代码:两种不同的场景。

//project1
//File1.c

int abc;//Global variable
/*And this variable is getting used in some other files too.*/
if(abc == 3) //Say
{
  printf("abc == 3");
}
else
{
  printf("abc != 3");
}
/*So if or else part will not be optimized 
because "abc" can not be predicted, 
the value can chage at any point of time */




//Project2
//file1.c

volatile int abc;//Global variable with volatile keyword

/*And this variable is getting used in some other files too.*/

if(abc == 3) //Say
{
  printf("abc == 3");
}
else
{
  printf("abc != 3");
}
/*So if or else part will not be optimized 
because "abc" can not be predicted as it is declared as volatile,
the value can chage at any point of time */

为什么我们应该使用volatile关键字?

4 个答案:

答案 0 :(得分:6)

正如Tony Delroy在评论中解释的那样,externvolatile是完全不同的。


易失性关键字可保护您的变量不会被积极优化。优化变量对于其他线程是不可见的,并且永远不会到达主存储器。有时,如果不需要,编译器可以even squeeze entirely变量。编译器根据您的源代码作为其唯一输入。有时,有一些外部事件可以改变您的变量值。例如,它可以是硬件设备或其他过程。

=>具体而言,编译器禁用对此变量的一些优化,因此它可以按照您的意愿运行。


外部与缓存与内存无关。 Extern 只是访问一个存在于其他目标文件中的变量。请参阅this short example,了解为 extern 访问生成的汇编代码类型。 那些 extern 变量尽可能在自己的目标文件中进行优化。毫无疑问是要保护它。

=>具体而言,编译器指示需要在链接时解决的外部引用

答案 1 :(得分:4)

声明或原型中的

易变表示始终从内存加载/存储值,无论本地静态还是 extern 这个vlaue(但在本地情况下并不总是有意义的。)

在常规来源中使用 volatile 关键字也是非常规的。在内核/驱动程序开发的特殊情况下,它仅适用于将硬件寄存器映射到内存的硬件(如ARM体系结构中)。

如果您在GUI或电子商务代码中使用易失性,那么您可能错了......

答案 2 :(得分:2)

volatile通常表示以下一项或多项:

  1. 该变量可能会被另一个OS线程更改
  2. 程序中的正常执行流程可能会被信号中断,信号处理程序可能会更改变量
  3. 正常的执行流程正在运行循环,变量正在循环中读取,变量通过点1或2更改
  4. volatile意味着在程序的整个生命周期中,有两个(或更多)读取变量的R1和R2,而R1和R2之间发生的一些其他事件将改变正常流量之外的变量执行。


    extern表示变量已在其他地方定义,并且程序正在重用该定义。

答案 3 :(得分:-1)

本质上,volatile用于表示变量的值将被不同的线程修改。

声明一个易变的Java变量意味着:

The value of this variable will never be cached thread-locally: all reads and writes will go straight to "main memory";
Access to the variable acts as though it is enclosed in a synchronized block, synchronized on itself. 

Extern本质上意味着所有模块都可以使用定义的变量。