之前一个例子 : 另人厌烦的线程安全单例以及不要使用双检测
说到了volatile , volatile本身跟线程没关系, 他只做了一件事:每次读取此变量时,都到内存中去读, 让编译器别优化.
gcc -O 进行优化后, 自动变量(int a) 一般情况下都可能被存放在寄存器中;
下面代码用回滚操作来说明 volatile 的作用:
#include "util.h"
#include <signal.h>
#include <setjmp.h>
static jmp_buf ev_buf;
int gval;
static void rollback(){
longjmp(ev_buf,1);
}
static void func1(int val,int sval,int vval,int rval){
printf("func1:\n\tgval:%d, val :%d,sval:%d, vval:%d,rval:%d\n",gval,val,sval,vval,rval);
rollback();
}
int main(int argc, char**argv)
{
int val = 1;
static int sval = 2;
volatile int vval = 3;
register int rval = 4;
int ret = 0;
if( (ret = setjmp(ev_buf)) != 0 ){
printf("from longjmp , ret : %d\n" , ret);
if( 1 == ret){
printf("from rollback:\n\tgval:%d, val :%d,sval:%d, vval:%d,rval:%d\n",gval,val,sval,vval,rval);
}
else{
puts("????? ");
}
puts("end from setjmp");
return 0;
}
puts("after setjmp");
printf("\tgval:%d, val :%d,sval:%d, vval:%d,rval:%d\n",gval,val,sval,vval,rval);
puts("change vals");
gval += 1;
val+=1;
sval+=1;
vval+=1;
rval+=1;
func1(val,sval,vval,rval);
puts("end main");
return 0;
}