我对C#中的内存屏障有一个问题。例如,如果一个写入语句是方法中的最后一条语句,比如(变量v2是我们关心的):
int _v1 = 0;
int _v2 = 0
void X()
{
_v1 = 2;
_v2 = 3;
Thread.MemoryBarrier();
}
作为最后一条语句,是不是需要内存屏障语句_v2。换句话说,处理器是否认识到这是一个方法的结束并刷新其缓存到内存中。
提前感谢。
我对C#中的内存屏障有一个问题。例如,如果一个写入语句是方法中的最后一条语句,比如(变量v2是我们关心的):
int _v1 = 0;
int _v2 = 0
void X()
{
_v1 = 2;
_v2 = 3;
Thread.MemoryBarrier();
}
作为最后一条语句,是不是需要内存屏障语句_v2。换句话说,处理器是否认识到这是一个方法的结束并刷新其缓存到内存中。
提前感谢。
_v2
后存在内存屏障,则应保持对Thread.MemoryBarrier
的调用不变。我没有看到任何文档表明在方法结束后会自动注入内存屏障。如果没有记录,则必须假定C#编译器、JIT编译器和硬件都可以自由地优化代码,即使实际上它们的选项可能受到实现细节的限制。