内存屏障是由于前后两条读写指令产生乱序所造成,产生乱序的原因有两种
1.由C或者其他语言转换为汇编时优化而产生
解决方法为
define barrier() asm volatile (“” : : : “memory”)
来告诉编译器不要为了性能优化而重排
2.由于多CPU间交互引起的内存乱序访问,每个单独的CPU无法分析出上下文的变量依赖关系。
解决方法为使用内存屏障指令
ARM64中内存屏障指令由
DMB 数据存储屏障(Data Memory Barrier)确保在执行新的存储器访问钱所有的存储器访问都已经完成
DSB 数据同步屏障(Data Synchronization Barrier)确保在下一条指令执行前所有的存储器访问都已经完成
ISB 指令同步屏障(Instruction Synchronization Barrier)清空流水线,确保在执行新的指令前,之前所有的指令都已经完成
LDAR 加载-获取指令,LDAR指令后的读写内存指令必须在LDAR指令之后才能执行
STLR 存储-释放指令,所有的加载和存储指令必须在STLR指令前完成
…
该类问题也可以考虑使用自旋锁方式解决(不一定全部都可以用)