C++ rtmp livestream ZeroC ICE OpenCV Media

海阔天空 张翼飞翔

我的学习笔记。--我爱这里,因为无广告的骚扰。
随笔 - 80, 文章 - 2, 评论 - 126, 引用 - 0
数据加载中……

演示volatile 关键字作用的一段C代码

在VC++6.0 Release模式下编译运行下面的代码,


#include  
<  iostream  >  
#include  
<  windows.h  >  

// volatile
unsigned  int  g_n0  =   0 ;

static     void   *   ThreadProc0(  void   *   param)
{
    
while  ( true )
    {
        g_n0
++ ;
    }    
    
return     0  ;


static     void   *   ThreadProc1(  void   *   param)
{
    
while  ( true )
    {
        printf(
" g_n0=%d\n " , g_n0);
        Sleep(
100 );            
    }
    
return     0  ;


int   main(   void   )
{
    CreateThread(NULL,  
0  , (LPTHREAD_START_ROUTINE)ThreadProc0,   0 ,   0  , NULL); 
    CreateThread(NULL,  
0  , (LPTHREAD_START_ROUTINE)ThreadProc1,   0 ,   0  , NULL); 

    getchar();
    
return     0  ;



虽然g_n0的值早已改变,但打印始终是
g_n0=0
在变量g_n0前加volatile 关键字可解决此问题。

VC++ 在产生release版可执行码时会进行编译优化,加volatile关键字的变量有关的运算,将不进行编译优化。
volatile 告诉编译器i是随时可能发生变化的,每次使用它的时候必须从他的地址中读取..而优化做法是,由于编译器发现两次从i读数据的代码之间的代码没有对i进行过操作,它会自动把上次读的数据放在k中。而不是重新从地址里面读。这样以来,如果i是一个寄存器变量或者表示一个端口数据就容易出错,所以说volatile可以保证对特殊地址的稳定访问,不会出错。

 

posted on 2012-05-04 10:24 ZhangEF 阅读(284) 评论(1)  编辑  收藏 所属分类: C/C++Code

评论

# re: 演示volatile 关键字作用的一段C代码[未登录]  回复  更多评论   

这是我看到的对volatile关键字的最浅显易懂的解释
2012-05-15 10:47 | 路人甲