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); }
|
阅读(2171) | 评论(0) | 转发(0) |