- 论坛徽章:
- 0
|
首先:不是加个volatile就是原子操作了。。volatile只是告诉Compiler不要对代码进行优化而己。。。
如:
直接看下面的例子
#include <stdio.h>
int main()
{
int i=10;
int a = i;
printf("i= %d\n",a);
//下面汇编语句的作用就是改变内存中i的值,但是又不让编译器知道,来隐式的修改了变量。
__asm {
mov dword ptr [ebp-4], 50h
}
int b = i;
printf("i= %d\n",b);
return 0;
}
然后,在调试版本(debug)模式运行程序,输出结果如下:
i = 10
i = 80
然后,在release版本模式运行程序,输出结果如下:
i = 10
i = 10
因为DEBUG版没有优化,而R版优化了。。如果给I 加上volatile它会每次都从内存中读而不是放到REG中
在单处理器上。。volatile仅能使单个变量同步,但其功能用限。。但如果是SMP结构。那就volatile就没用了。。必须在操作变量时锁中总线。。。。
所以内核中提供了一些原子操作函数,它在I386和SMP上都是适用的。。。。 |
|