【发布时间】:2017-10-20 12:26:00
【问题描述】:
Volatile.Read 的实现只是在读取之后插入了一个内存屏障:
public static int Read(ref int location)
{
var value = location;
Thread.MemoryBarrier();
return value;
}
因此,这样的方法的使用......
return Volatile.Read(ref _a) + Volatile.Read(ref _b);
...相当于:
var a = _a;
Thread.MemoryBarrier();
var b = _b;
Thread.MemoryBarrier();
return a + b;
鉴于上述情况,如果参数不是ref,则结果行为是否相同?
public static int Read(int value)
{
Thread.MemoryBarrier();
return value;
}
我猜ref 参数只是用来防止程序员传递变量以外的东西,例如Volatile.Read(2 + 3)。传入变量时,任何人都可以看到ref 的任何其他原因吗?
【问题讨论】:
-
因为否则您正在阅读副本?
-
是的,但这有关系吗?在读取原件和后续使用之间是否仍会插入内存屏障?