处理器流水线设计、编译器优化设计,为了获得更高性能,有时程序代码顺序会被重新编排。
这种 重编排有时 会带来意外的程序 错误。
如:
preempt_disable();
function_which_must_not_be_preempted();
preempt_enable();
可能如下重排效果:
function_which_must_not_be_preempted();
preempt_disable();
preempt_enable();
也可能如下重排效果:
preempt_disable();
preempt_enable();
function_which_must_not_be_preempted();
为了消除这种重排影响,可以在计数器修改前后添加屏障指令:
<preempt.h>
#define preempt_disable() \
do { \
inc_preempt_count(); \
barrier(); \
} while (0)
驱动为了防止cpu指令优化执行,可以使用 屏障指令,如: