1.程序运行时,需要的数据可能要经过寄存器,cache,缓冲区,主存,
TLB,MMU等转换或读取出来。为提高速度,cpu首先使用过的是载入
到cpu内置单元的寄存器页数据,可能这时外部或者其他存放地方的这
个数据已经改变。
2.编译器的优化掉相关的代码,
volatile的目的:告诉编译器,每次都要从内存中真正读取。
使用的地方:
1.多线程中被几个任务共享的变量
2.并行的硬件寄存器变量
3.中断服务子程序访问到的非自动变量
在C中内存屏障的实现:
#define mb() __asm__ __volatile__ ("" : : : "memory")
#define set_mb(var, value) do { var = value; mb(); } while (0)
串行化指令:迫使处理器在下一条指令执行前完成所有先前的指令对标志,
寄存器及存储器的修改,并将缓存的写入到主存中。
阅读(610) | 评论(0) | 转发(0) |