3.内存屏障

内存屏障

内存屏障,本质上也是一种指令,只不过它具有屏障的作用而已。

内存屏障可以分为两类,一种是强制读取主内存,强制刷新主内存的内存屏障,叫做Load屏障和Store屏障。

另外一种是禁止指令重排序的内存屏障,分别为LoadLoad屏障、StoreStore屏障、LoadStore屏障、StoreLoad屏障。

强制读取/刷新主内存的屏障

  • Load屏障:执行读取数据的时候,强制每次都从主内存中读取最新的值。
  • Store屏障:每次执行修改数据的时候,强制刷新回主内存。

Load屏障

在这里插入图片描述

如上图所示:在工作内存的变量名、变量的值之前有一道关卡或者栅栏,导致变量 i 获取不到工作内存中的值,所以每次只好主内存重新加载咯。

Store屏障

如上图所示,每次执行assign指令将数据变更之后,后面都会紧紧跟着一个Store屏障,让你立刻刷新到主内存

禁止指令重排序的屏障

LoadLoad屏障

序列:load1指令 LoadLoad屏障 load2指令

作用:在load1指令和load2指令之间加上 LoadLoad屏障,强制先执行load1指令再执行load2指令;load1指令和load2指令不能进行重排序(也就是说LoadLoad屏障的前面load指令禁止和屏障后面的load指令进行重排序)。

StoreStore屏障

序列:store1指令 StoreStore屏障 store2指令

作用:在store1指令和store2指令之间加上StoreStore屏障,强制先执行store1指令再执行store2指令;store1指令不能和store2指令进行重排序(也就是说StoreStore屏障的前面的store指令禁止和屏障后面的store指令进行重排序)

LoadStore屏障

序列:load1指令 LoadStore屏障 store2指令

作用:在load1指令和store2指令之前加上LoadStore屏障,强制先执行load1指令再执行store2指令;load1指令和store2执行不能重排序(也就是说LoadStore屏障前面的load指令禁止和屏障后面的store指令进行重排序)

StoreLoad屏障

序列:store1指令 StoreLoad屏障 load2指令

作用:在store1指令和load2指令之间加上StoreLoad屏障,强制先执行store1指令再执行load2指令;store1指令和load2指令执行不能重排序(这个屏障功能比较强大,StoreLoad屏障前面的Store指令禁止和屏障后面的Store/Load指令进行重排)
在这里插入图片描述

就是搞了个栅栏啊,说白了就是相当于搞了个围墙,不让各个指令之间跳来跳去的,这样达到禁止区域之间重排序的效果

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值