В "С# 4 в двух словах" автор показывает, что этот класс может писать 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);
}
Эта потребность кажется сумасшедшей для меня. Как я могу узнать все возможные случаи, когда это может произойти? Я думаю, что если процессор изменяет порядок операций, он должен гарантировать, что поведение не изменится.
Вы беспокоитесь об использовании барьеров?