私は、次のC#クラスに同じオブジェクトを呼び出す複数のスレッドが同時に機能します。それは問題を引き起こすことができますか?
class MyClass
{
private int _i;
private object _locker = new object();
public void DoSomething()
{
var b = 2;
// some work that depends on b being 2
lock(_locker)
{
_i = 3;
}
// some more work
b = -1;
// some more work
}
}
を持っていると私はそれをこのように使用すると仮定し、
//Usage:
var myobject = new MyClass();
new Thread(new ThreadStart(() => myobject.DoSomething())).Start();
new Thread(new ThreadStart(() => myobject.DoSomething())).Start();
には、以下のシーケンスが起こることはできますか?
Thread 1 is halfway through its work.
Thread 2 just starts. Sets b = 2.
Thread 1 sets b = -1.
Thread 2 is confused because it expected b to be 2 but its -1.
重要な点は、b
がローカル変数であるということです。 2つのスレッドがbの同じインスタンスにアクセスできますか?私は、インスタンス変数_i
の場合、これが起こることを理解しています。したがって、そのためのlock
の構成。しかし、ローカル変数のロックを行う必要があるかどうかはわかりません。
「b」はローカルであり、したがって各スレッドに固有です。 –
'_i'に同じ値を2回だけ割り当てた場合、スレッドを開始する前に非並行コードで代入を移動することを検討してみませんか? (または終了時に) –