2016-12-10 12 views
0

変数「カウンタ」をスレッドごとにプライベートに保つ必要があります。C#のロックで変数がプライベートにならない

私が使用してみました:

object locker = new object(); 
private object locker = new object(); 
private static readonly object locker = new object(); 

しかし、それらのどちらも動作します。

私はこの問題を解決するために他にどのような方法がありますか?

ここに私のコードです。

public partial class Form1 : Form 
{ 

    int counter = 0; 
    private static readonly object locker = new object(); 
    public Form1() 
    { 
     InitializeComponent(); 
     Task t1 = new Task(() => 
     { 
      func(); 
     }); 
     Task t2 = new Task(() => 
     { 
      func(); 
     }); 
     // two threads 
     t1.Start(); 
     t2.Start(); 
    } 

    void func() 
    { 
     lock (locker) 
     { 
      counter++; 
      Console.Write(counter + " "); // prints "1 2" 
              // it should print "1 1" 
     } 
    } 
} 
+0

'func'の内部で' counter'を動かせる理由は何ですか? – Abion47

+0

スレッドロック変数は問題ではありません。これはまさに期待される出力です - あなたは 'counter'変数をスレッドセーフにしました。一度に1つのスレッドだけ増分することができるので、 '1 2 'となります。セーフガード( 'lock(..)')を削除すると、出力が予測不可能になり、 '1 1'が出力されるようになります。これは2つのスレッドが同時に同じ変数を読み書きできるためです。 'counter'は、クラスに対して** global **変数であり、スレッドローカル変数ではありません。 –

+0

@ MaximilianGerhardt私はあなたがクラスレベルの変数を意味すると思います。 C#にはグローバル変数はありません。 – Abion47

答えて

関連する問題