Зачем нам нужен Thread.MemoryBarrier ()?

В "C # 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);
}

Эта потребность кажется сумасшедший для меня. Как я могу распознать все возможные случаи, когда это может произойти? Я думаю, что если процессор меняет порядок операций, он должен гарантировать, что поведение не изменится.

Вам не нравится использовать барьеры?

47
задан Adi Lester 14 August 2012 в 20:57
поделиться