Chinaunix首页 | 论坛 | 博客
  • 博客访问: 426719
  • 博文数量: 103
  • 博客积分: 5010
  • 博客等级: 大校
  • 技术积分: 971
  • 用 户 组: 普通用户
  • 注册时间: 2007-06-11 17:22
文章分类
文章存档

2008年(77)

2007年(26)

我的朋友

分类: C/C++

2008-01-08 23:47:50

1.保证局部变量在longjmp过程中一直保存它的值的唯一方法是把它声明为volatile变量。(适合那些在setjmp执行和longjmp返回之间会改变的变量);
2.setjmp的man手册说明:存放在存储器中的变量将具有longjmp时的值,而在cpu和浮点寄存器中的变量则恢复为调用setjmp函数时的值;
3.gcc -O filename,进行优化编译后,register和auto变量都存放在寄存器中,而volatile变量仍存放在存储器中;而不优化编译的话auto变量仍然存放在存储器中;
4.volatile变量:一般在多线程编程中使用的比较多,例如有一个int x,有两个线程都要对其读写,一般的编译器或者cpu都会自作聪明的把x保存在寄存器的某个地方,然乎读的时候直接读取寄存器里的内容而不是真实的x在存储器中的内容,从而容易引起问题,比如x = 1,线程1读取x并加1,此时存储器中x的值是2,而此时线程2也想读x,结果线程2读取的确实寄存器中的x = 1.
所以,给这个变量加上volatile,就是指示程序每次读写变量都必须从存储器中读取,不要进行缓存(到寄存器),这样的读取才是真实的;

#include <stdio.h>
#include <stdlib.h>
#include <setjmp.h>

static jmp_buf jmpbuf;
static void func(int s, int r, int v, int a);

int main(void)
{
        static int s = 1;
        register int r = 1;
        volatile int v = 1;
        auto int a = 1;

        if(setjmp(jmpbuf) != 0){
                printf("s = %d, r = %d, v = %d, a = %d\n", s, r, v, a);
                exit(0);
        }

        s = r = v = a = 999;
        func(s, r, v, a);

        exit(0);
}

static void func(int s, int r, int v, int a)
{
        printf("s = %d, r = %d, v = %d, a = %d\n", s, r, v, a);
        longjmp(jmpbuf, 1);
}

阅读(2106) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~