在"C#4 in a Nutshell"中,作者表明这个类有时可以写0 MemoryBarrier但是我无法在我的Core2Duo中重现:
public class Foo
{
int _answer;
bool _complete;
public void A()
{
_answer = 123;
//Thread.MemoryBarrier(); // Barrier 1
_complete = true;
//Thread.MemoryBarrier(); // Barrier 2
}
public void B()
{
//Thread.MemoryBarrier(); // Barrier 3
if (_complete)
{
//Thread.MemoryBarrier(); // Barrier 4
Console.WriteLine(_answer);
}
}
}
private static void ThreadInverteOrdemComandos()
{
Foo obj = new Foo();
Task.Factory.StartNew(obj.A);
Task.Factory.StartNew(obj.B);
Thread.Sleep(10);
}
Run Code Online (Sandbox Code Playgroud)
这种需要对我来说似乎很疯狂.如何识别出现这种情况的所有可能情况?我认为如果处理器改变了操作顺序,它需要保证行为不会改变.
你还懒得使用障碍吗?
这个问题是这个帖子中评论的后续内容.
我们假设我们有以下代码:
// (1)
lock (padlock)
{
// (2)
}
var value = nonVolatileField; // (3)
Run Code Online (Sandbox Code Playgroud)
此外,我们假设没有任何指令对其(2)有任何影响,nonVolatileField反之亦然.
读取指令是否(3)可以以锁定语句之前(1)或其内部结束的方式重新排序(2)?
据我所知,C#规范(§3.10)和CLI规范(§I.12.6.5)中没有任何内容禁止此类重新排序.
请注意,这与此问题不同.在这里,我特别询问阅读说明,因为据我所知,它们不被认为是副作用,并且有较弱的保证.