顺序取出,乱序执行,顺序提交结果执行
。在有些情况下,处理器无法识别指令之间的关系,这时就会导致指乱序执行导致执行结果不符合预期编译器屏障
、处理器内存屏障
、内存映射IO写屏障
。这里着重介绍编译器屏障
barrier()
是编译器提供的屏障的函数,这个函数会阻止编译器把屏障一侧的指令移动到另一侧,既不把屏障前面的指令移动到屏障后面,也不能把屏障后面的指令移动到屏障前面,编译器屏障也叫做编译器优化屏障。内核定义了宏READ_ONCE()、WRITE_ONCE()和ACCESS_ONCE()可以看做barrier()
弱化形式,只阻止编译器对于单个变量优化,C语言提供了关键字volatile
可以防止编译器优化单个变量。