我对C#中的内存障碍有疑问。 例如,如果写入语句是方法中的最后一个语句(变量v2是关注的那个):
int _v1 = 0;
int _v2 = 0
void X()
{
_v1 = 2;
_v2 = 3;
Thread.MemoryBarrier();
}
是否需要内存屏障语句,因为_v2 write是最后一个语句。换句话说,处理器是否认识到这是方法的结束,并应将其缓存刷新到内存中。
提前致谢。
答案 0 :(得分:3)
如果您希望在写入_v2
后存在内存屏障,则应按原样保持对Thread.MemoryBarrier
的调用。我没有看到任何表明在方法结束后自动注入内存屏障的文档。如果没有记录,那么你必须假设C#编译器,JIT编译器和硬件在他们认为合适时优化代码时都给予了最大的自由,即使实际上他们的选项可能受到实现细节的限制。