C#内存障碍

时间:2014-10-14 06:01:15

标签: c# multithreading memory-barriers

我对C#中的内存障碍有疑问。 例如,如果写入语句是方法中的最后一个语句(变量v2是关注的那个):

int _v1 = 0;
int _v2 = 0

void X()
{
    _v1 = 2;
    _v2 = 3;
   Thread.MemoryBarrier();
}

是否需要内存屏障语句,因为_v2 write是最后一个语句。换句话说,处理器是否认识到这是方法的结束,并应将其缓存刷新到内存中。

提前致谢。

1 个答案:

答案 0 :(得分:3)

如果您希望在写入_v2后存在内存屏障,则应按原样保持对Thread.MemoryBarrier的调用。我没有看到任何表明在方法结束后自动注入内存屏障的文档。如果没有记录,那么你必须假设C#编译器,JIT编译器和硬件在他们认为合适时优化代码时都给予了最大的自由,即使实际上他们的选项可能受到实现细节的限制。