C# 内存屏障

3

我对C#中的内存屏障有一个问题。例如,如果一个写入语句是方法中的最后一条语句,比如(变量v2是我们关心的):

int _v1 = 0;
int _v2 = 0

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

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

提前感谢。


1
旁注:处理器不知道任何关于C#方法的信息,因此即使在JIT之后,生成的CPU指令也可能与方法完全不同 - 例如可以内联。 - Alexei Levenkov
好的。那么,在上下文中内存屏障语句仍然必要吗?@AlexeiLevenkov - Oday Fraiwan
1
可能是重复的问题:为什么我们需要Thread.MemoryBarrier()? - Ian Mercer
你引用的帖子是关于内存栅栏使用的问题。然而,我想问的是一个特定情况,即上面的栅栏语句是否必要。@IanMercer - Oday Fraiwan
你的情况与示例中的Barrier#2有何不同? - Ian Mercer
显示剩余2条评论
1个回答

3
如果您想在写入_v2后存在内存屏障,则应保持对Thread.MemoryBarrier的调用不变。我没有看到任何文档表明在方法结束后会自动注入内存屏障。如果没有记录,则必须假定C#编译器、JIT编译器和硬件都可以自由地优化代码,即使实际上它们的选项可能受到实现细节的限制。

非常感谢,那正是我所询问的。 - Oday Fraiwan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接