3

Non-Blocking Synchronizationで指定されたプログラムを次のように変更しました。

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.>> それらはメモリバリアを意味すると述べています。

メモリバリアを取り除いても、出力に変化はありません。if 条件が真であることを確認していません。

私はそれを間違った方法で解釈しましたか?

ありがとう。

4

1 に答える 1

1

私はまさにこの例についてここここで話します。

一言で言えば、著者は正しいです。発言には十分注意してください。特に、著者が「B が A を追いかけたら」と言っていることに注意してください。彼は、条件が常にtrue と評価されるとは言っていません。代わりに、この例は、メモリバリアの特定のニュアンスを示すために考案されました。

さらに、メモリバリアを取り除くことによって異なる結果を得ることは、再現が困難になります。これには多くの理由があります。これは、テストを実行していた環境が原因である可能性があります。

于 2011-05-02T13:02:29.987 に答える