指令的内存屏障 的 思考

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/harryhare/article/details/83149133

随便写的,记在这里,不一定对。

起因是我看的这篇中读写屏障的概念,恍惚觉得上编译原理时好像听到过这个词
漫画:什么是volatile关键字?(整合版)

具体是这几段:

什么是内存屏障?
内存屏障(Memory Barrier)是一种CPU指令,维基百科给出了如下定义:
A memory barrier, also known as a membar, memory fence or fence instruction, is a type of barrier instruction that causes a CPU or compiler to enforce an ordering constraint on memory operations issued before and after the barrier instruction. This typically means that operations issued prior to the barrier are guaranteed to be performed before operations issued after the barrier.
翻译结果如下:
内存屏障也称为内存栅栏或栅栏指令,是一种屏障指令,它使CPU或编译器对屏障指令之前和之后发出的内存操作执行一个排序约束。 这通常意味着在屏障之前发布的操作被保证在屏障之后发布的操作之前执行。

内存屏障共分为四种类型:

LoadLoad屏障
抽象场景:Load1; LoadLoad; Load2
Load1 和 Load2 代表两条读取指令。在Load2要读取的数据被访问前,保证Load1要读取的数据被读取完毕。

StoreStore屏障:
抽象场景:Store1; StoreStore; Store2
Store1 和 Store2代表两条写入指令。在Store2写入执行前,保证Store1的写入操作对其它处理器可见

LoadStore屏障:
抽象场景:Load1; LoadStore; Store2
在Store2被写入前,保证Load1要读取的数据被读取完毕。

StoreLoad屏障
抽象场景:Store1; StoreLoad; Load2
在Load2读取操作执行前,保证Store1的写入对所有处理器可见。StoreLoad屏障的开销是四种屏障中最大的。

volatile做了什么?
在一个变量被volatile修饰后,JVM会为我们做两件事:
1.在每个volatile写操作前插入StoreStore屏障,在写操作后插入StoreLoad屏障。
2.在每个volatile读操作前插入LoadLoad屏障,在读操作后插入LoadStore屏障。

有没觉得 volatile 做的事情对称性很强。
下面的例子,假设每一句都执行在不同的线程中(除了那个if块)。
方便记忆吧。。

volatile int a;
a=1;
// store store 屏障,防止a=1 和 a=2 交换
a=2;
// store load 屏障, 防止print(a) 和 a=2  交换
print(a)
volatile int a;
auto result=do_job()
a=1;
// load load 屏障, 防止result 没有赋值
if(a!=0){
// load store 屏障, 防止 a=0 和 a!=0 交换
print(result)
}
a=0

猜你喜欢

转载自blog.csdn.net/harryhare/article/details/83149133
今日推荐