c++ Volatile关键词深度剖析

原文地址:何登成的技术博客
http://hedengcheng.com/?p=725\


* int setjmp(jmp_buf env)

创建本地的jmp_buf缓冲区并且初始化,用于将来跳转回此处。这个子程序[1] 保存程序的调用环境于env参数所指的缓冲区,env将被longjmp使用。如果是从setjmp直接调用返回,setjmp返回值为0。如果是从longjmp恢复的程序调用环境返回,setjmp返回非零值。

* void longjmp(jmp_buf env, int value)

恢复env所指的缓冲区中的程序调用环境上下文,env所指缓冲区的内容是由setjmp子程序[1]调用所保存。value的值从longjmp传递给setjmp。longjmp完成后,程序从对应的setjmp调用处继续执行,如同setjmp调用刚刚完成。如果value传递给longjmp零值,setjmp的返回值为1;否则,setjmp的返回值为value。

volatile(易变的),编译器不做优化,直接读取原始的内存地址

嵌入式开发中寄存器数据定义时经常使用
#define CONDATA ((volatile int )0x80000000)

#include 
#include 
#include 

static jmp_buf buf;

main()
{
    int a;
    volatile int b;
    a = 2;
    b = 3;
    if(setjmp(buf) != 0)
    {
        printf("a:%d,b:%d\n", a, b);
        exit(0);
    }
    a = 5;
    b = 5;
    longjmp(buf,1);
}


volatile修饰后,访问都要取内存中的值,而不是当前环境的值

volatile的应用位置

  1. 硬件寄存器数据访问时,如果这个寄存器的数据可能被硬件修改。一定使用volatile修饰这个变量
  2. 中断服务程序中的一些非自动变量
  3. 在多线程中被几个线程共享的变量

volatile**不能保证程序执行的原子性以及只能一定程度上保证有序性(能禁止指令重排序),但是这里只能保证volatile所修饰的变量之前的程序不会在该变量之后执行,该变量之后的代码不会在变量之前执行。**
明确的说,volatile 跟多线程无关,它不是一种同步手段,用它来实现线程安全是错的。

c++ Volatile关键词深度剖析_第1张图片


你可能感兴趣的:(C++)