编译乱序也就是编译器对访存的执行进行乱序 减少逻辑上不必要的访存 已经尽量提高cache命中率和cpu的load/store单元的工作效率 因此在打开编译器优化以后 看到生成的汇编码并没有严格按照代码的逻辑顺序
怎么解决这个问题 设置编译屏障
barrier();
这样的话就能解决编译乱序所造成的问题
那么你可能会说 volatile也可以实现这个功能啊 其实在编译乱序的问题上 volatile的作用比较弱 它更多的只是避免内存访问行为的合并 也就是volatile会让cpu每次都会去内存取值 并且volatile也具备保护临界资源的作用 linux内核明显不太喜欢volatile
乱序执行也就是在处理器执行时 后发射的指令还是可能先执行完 这就是CPU乱序执行策略 高级的CPU可以根据自己缓存的组织特性 将访问执行重新排序执行
具体的处理可能如下
1.连续地址的访问可能会先执行 因为这样缓存命中率高
2.允许访存的非阻塞 如果前面一条访存命令因为缓存不命中 造成长延时的存储访问 后面的访存指令可以先执行 以便从缓存中取数
为了解决这两种情况 可以使用DMB DSB ISB这三个指令 自旋锁互斥锁的获得锁 解锁操作都是要使用这几个执行