内存屏障
内存屏障,本质上也是一种指令,只不过它具有屏障的作用而已。
内存屏障可以分为两类,一种是强制读取主内存,强制刷新主内存的内存屏障,叫做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指令进行重排)
就是搞了个栅栏啊,说白了就是相当于搞了个围墙,不让各个指令之间跳来跳去的,这样达到禁止区域之间重排序的效果。