3

我修改了在非阻塞同步上给出的程序如下:

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.>> 它们意味着内存屏障。

即使我消除了内存障碍,输出也没有变化。并且不确定条件是否为真。

我是否以错误的方式解释它?

谢谢。

4

1 回答 1

1

我在这里这里谈论这个例子。

简而言之,作者是对的。密切注意声明。特别注意,作者说“如果 B 在 A 之后跑”。他并不是说条件总是会评估为真。相反,该示例旨在展示内存屏障的一个特殊细微差别。

此外,通过消除内存障碍获得不同的结果将难以重现。这件事情是由很多原因导致的。这可能是由于您运行测试的环境所致。

于 2011-05-02T13:02:29.987 回答