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"
}
}
}
'func'の内部で' counter'を動かせる理由は何ですか? – Abion47
スレッドロック変数は問題ではありません。これはまさに期待される出力です - あなたは 'counter'変数をスレッドセーフにしました。一度に1つのスレッドだけ増分することができるので、 '1 2 'となります。セーフガード( 'lock(..)')を削除すると、出力が予測不可能になり、 '1 1'が出力されるようになります。これは2つのスレッドが同時に同じ変数を読み書きできるためです。 'counter'は、クラスに対して** global **変数であり、スレッドローカル変数ではありません。 –
@ MaximilianGerhardt私はあなたがクラスレベルの変数を意味すると思います。 C#にはグローバル変数はありません。 – Abion47