6

VolatileC# でのキーワードのリアルタイム使用を確認したい。しかし、最良の例を投影することはできません。以下のサンプル コードはVolatileキーワードなしで機能します。

class Program
{
    private static int a = 0, b = 0;

    static void Main(string[] args)
    {
        Thread t1 = new Thread(Method1);
        Thread t2 = new Thread(Method2);

        t1.Start();
        t2.Start();

        Console.ReadLine();
    }

    static void Method1()
    {
        a = 5;
        b = 1;
    }

    static void Method2()
    {
        if (b == 1)
            Console.WriteLine(a);
    }
}

上記のコードでは、値を 5 として取得しています。volatile キーワードを使用せずにどのように機能しますか?

4

2 に答える 2

11

このvolatileキーワードは、変数がいつでも変更される可能性があることをコンパイラに伝えるため、変数の読み取りと書き込みを最適化してはいけません。

次のようなコードを検討してください。

int sum;
for (var i = 0; i < 1000; i++) {
  sum += x * i;
}

変数xはループ内で変更されないため、コンパイラはループ外で一度変数を読み取り、ループ全体で同じ値を使用する可能性があります。

変数をx揮発性にすると、コンパイラは変数が使用されるたびにその値を読み取るため、別のスレッドで値を変更すると、新しい値がすぐに使用されます。

于 2012-12-03T13:00:20.720 に答える
2

volatile適切に使用すれば、コードは確実に機能します。コードで必要な場所を省略してvolatileも、ほとんどの場合は問題なく動作しますが、保証されていないため、最も影響を受けるときに失敗する可能性があります。

スレッド競合のあるコードがどのように失敗するか、または失敗しないかを理解するには、実装とプラットフォームを深く理解する必要があります。これは単純ではなく、通常は心配する必要はありません。ルールに従うだけで、コードは常に機能します。

于 2012-12-03T13:00:08.013 に答える