由于编译器和处理器可以打乱程序的执行顺序,所以有些时候,我们需要“memory barrier
”来保证内存访问指令的执行顺序(load
和store
指令):
(1)rmb()
:提供一个读(load
)操作的“memory barrier
”,保证读操作不会跨越rmb()
进行reorder
。即rmb()
之前的读(load
)操作不会reorder rmb()
之后,而rmb()
之后的读(load
)操作不会reorder rmb()
之前。
(2)wmb()
:提供一个写(store
)操作的“memory barrier
”,同rmb
类似,不过wmb()
是保证写操作不会跨越wmb()
进行reorder
。
(3)mb()
:保证读写操作都不会跨越mb()
进行reorder
。
(4)read_barrier_depends()
:rmb()
的一个变种,但仅保证有依赖关系的读操作不会跨越rmb()
进行reorder
。
其它还有smp_rmb()
,smp_wmb()
搜索。