2012-12-03 11 views
6

Volatileキーワードのリアルタイム使用をC#で見たいです。最良の例を投影することはできません。以下のサンプルコードはVolatileキーワードなしで動作しますか?C#の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キーワードを使用しないとどのように動作しますか?

+1

動作しません。あなたは 'volatile 'を使うのを忘れてしまったので、5以外の値を取ることを期待しています。しかし、あなたは5になるので、何かを残すことで期待しているのは働きません。 (バグを修正し、謎が解消されます。スレッドバグのコードはほとんど理解できません。修正して忘れてください。) –

+0

volatileのベストプラクティスを教えてください。 – Gun

+0

これで 'volatile 'キーワードがなくても、プログラムが' 0'を出力しない**保証**はありません。それは(いつか) '0'を出力するかもしれません。 'volatile'キーワードを追加した場合、' 0'を出力することはできませんが、 '_'は出力できません。 –

答えて

11

volatileキーワードは、変数がいつでも変更できることをコンパイラに知らせるので、変数の読み書きを最適化してはいけません。

は、このようなコードを考えてみましょう:変数xとして

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

は、ループ内で変更されませんコンパイラはループの外に一度変数を読み、ちょうどループ全体で同じ値を使用する場合があります。

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

2

volatileを正しく使用すると、コードは動作することが保証されます。あなたのコードが必要とするところにvolatileを残しておけば、ほとんどの場合は大丈夫でしょうが、保証されておらず、おそらく最悪の場合には失敗するでしょう。

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

関連する問題