Неблокирующая синхронизация (MemoryBarrier) - PullRequest
3 голосов
/ 02 мая 2011

Я изменил программу, заданную для Неблокирующая синхронизация , следующим образом:

class DemoProg
{
    int _answer;
    bool _complete;

    public void StartDemo()
    {
        Thread t1 = new Thread(A);
        Thread t2 = new Thread(B);
        t1.Start();
        // Thread.Sleep(100); // To ensure that B is called after A.
        t2.Start();
    }

    void A()
    {
        for (int i = 0; i < 1000000; i++)
            _answer = 123;
        Thread.MemoryBarrier();    // Barrier 1
        _complete = true;
        Thread.MemoryBarrier();    // Barrier 2
        Console.WriteLine("Exiting A");
    }

    void B()
    {
        //Thread.Sleep(100);
        Thread.MemoryBarrier();    // Barrier 3
        if (_complete)
        {
            Thread.MemoryBarrier();       // Barrier 4
            Console.WriteLine(_answer);
        }
        Console.WriteLine("Exiting B");
    }
}

В статье говорится, что they ensure that if B ran after A, reading _complete would evaluate to true. >> они означают барьеры памяти.

Даже если я уберу барьеры памяти, выходной сигнал не изменится. и это не гарантирует, что если условие в результате будет истинным.

я истолковал это неправильно?

Спасибо.

1 Ответ

1 голос
/ 02 мая 2011

Я говорю об этом самом примере здесь и здесь .

В двух словах, автор правильный. Обратите очень пристальное внимание на утверждение. В частности, обратите внимание, что автор говорит: «Если Б побежал за А». Он не говорил, что условие будет всегда оценивать как истинное. Вместо этого пример был придуман, чтобы продемонстрировать один конкретный нюанс барьеров памяти.

Кроме того, будет трудно воспроизвести другой результат путем устранения барьеров памяти. Существует много причин для этого. Вероятно, это связано со средой, в которой вы выполняли тесты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...