C# 4入门经典(强烈推荐)使用以下代码演示MemoryBarrier的概念(假设A和B在不同的线程上运行):
class Foo{
int _answer;
bool complete;
void A(){
_answer = 123;
Thread.MemoryBarrier(); // Barrier 1
_complete = true;
Thread.MemoryBarrier(); // Barrier 2
}
void B(){
Thread.MemoryBarrier(); // Barrier 3;
if(_complete){
Thread.MemoryBarrier(); // Barrier 4;
Console.WriteLine(_answer);
}
}
}
他们提到屏障1和4阻止了这个示例写入0,而屏障2和3提供了一个“新鲜度”保证:它们确保如果B在A之后运行,读取_complete将评估为true。我不太明白为什么需要屏障2。也许线程2(运行B)已经运行到(但不包括)if(_complete),因此我们需要确保刷新_complete。但是,我看不出这有什么帮助。是否仍然可能在A中将_complete设置为true,但B方法将看到缓存的(false)版本_complete?即,如果线程2运行了B方法直到第一个MemoryBarrier然后线程1运行了A方法直到_complete = true,但没有进一步操作,然后线程1恢复并测试if(_complete)-那么那个if不能导致false吗?