2016-07-13 13 views
1

ThreadStatic属性を使用するコードを実行しようとしましたが、何らかの理由で別の結果が表示されていました。ThreadStatic属性を使用すると異なる結果

[ThreadStatic] 
    public static int _field; 
    public static void Main(string[] args) 
    { 
     new Thread(() => 
     { 
      for(int x = 0; x < 10; x++) 
      { 
       _field++; 
       Console.WriteLine("Thread A: {0}", _field); 
      } 
     }).Start(); 

     new Thread(() => 
     { 
      for(int x = 0; x < 10; x++) 
      { 
       _field++; 
       Console.WriteLine("Thread B: {0}", _field); 
      } 
     }).Start(); 

     Console.ReadKey(); 
    } 

結果1:
Result 1

結果2:
Result 2

、なぜ誰も私に説明できますか?ありがとうございました!

+1

何が起こると思われますか?結果はあなたの期待とどう違うのですか?両方とも、このコードの結果として完全に受け入れられるように見えます。 – Servy

+0

マルチスレッドの魔法。なぜそれがこのようではないと思いますか? – Will

+0

申し訳ありませんが、私はまだ初心者で、スレッドの概念を理解しようとしています。 –

答えて

1

複数のスレッドでコードを実行すると、実行順序が予測できなくなります。あなたはまったく同じ結果を何度も繰り返し得るかもしれませんが、それから別のことをするでしょう。

一貫した動作に依存しない限り、その一貫性のない動作は問題ありません。建物を塗装している二人の人のように考えてください。一つは後ろから始まり、もう一人が前から始まります。

このDotNetFiddleが示しています。それはConcurrentQueueに一連の連続番号を入れ、複数のスレッドを使って先入れ先出しを別のキューに移動します。彼らはいつも同じ順序で2番目のキューに到着し、そうでない場合よりも頻繁に到着すると予想するかもしれません。しかし、しばらくして、彼らはしません。

この動作に注意することは非常に重要です。さもなければ私達はマルチスレッドコードを書くことができ、それをテストし、それは一方的に働くように思われますが、後で予測不可能な結果が得られますが、その理由を理解することはできません。それが起こると問題を見つけるのが非常に困難になることがあります。しかし、予測できない行動に依存しているのはそれだけの問題です。

0

スレッドがCPUタイムスライスを取得するタイミングを制御できないためです。したがって、注文は各ランごとに異なります。

+1

各スレッドには変数のコピーがあります。したがって、相互には相互作用していないため、共有リソースがないため、すべてのリソースへのアクセスを同期させる必要はありません。 – Servy

+0

@Servy、良い点、答えを編集しました。 – GreatAndPowerfulOz

+0

ええ、2行目以降はすべて削除してください。あなたはちょうどそうでした:(編集) – Will

関連する問題