barrier() 静态内存屏障,防止编译阶段的乱序与优化。
mb() 动态内存屏障,防止CPU处理的乱序。
barrier()在x86中的实现就是一行内嵌汇编代码:
测试代码如下:
对应汇编代码分别为:
mb() 动态内存屏障,防止CPU处理的乱序。
barrier()在x86中的实现就是一行内嵌汇编代码:
__asm volatile("": : :"memory");
告诉编译器,barrier()前后的内存操作要确保按顺序实实在在的进行。
测试代码如下:
int ga = 0;
int gb = 0;
#define barrier() __asm__ volatile("":::"memory")
int foo(int i)
{
ga = i*i;
barrier();
gb = i;
return ga+gb;
}
对应汇编代码分别为:
#没有barrier()
foo:
pushl %ebp
movl %esp, %ebp
movl 8(%ebp), %eax
popl %ebp
movl %eax, %edx
imull %eax, %edx
movl %eax, gb
movl %edx, ga
leal (%edx,%eax), %eax
ret
#加入barrier()
foo:
pushl %ebp
movl %esp, %ebp
movl 8(%ebp), %eax
movl %eax, %edx
imull %eax, %edx
movl %edx, ga