0

public Action Update;複数のスレッドから呼び出すことができるフィールドがあります。また、このフィールドはnullなどに変更できます。プロパティを作成してその中でlockステートメントを使用する必要がありますか?またはUpdate = new Action (...)、アトミック操作を設定し、ロックを必要としない場合はどうなりますか?

4

2 に答える 2

4

Anders の回答に従いますが、競合状態を回避するために null チェックを行う場合は、変数の値を一時的にローカル変数に格納する必要があります。

悪い例:

if(myClass.Update != null)
{
    // Race condition if Update is set to null here by another thread
    myClass.Update();
}

良い例え:

var updateMethod = myClass.Update;
if(updateMethod != null)
{
    // No race condition since we try to call
    // the same value that we checked for null
    updateMethod();
}
于 2013-01-10T22:07:50.523 に答える
3

C# での参照の設定はアトミック操作であるため、ロックは必要ありません。ただしUpdate、変更時にすべてのスレッドで適切に更新されるように、参照を揮発性にする必要があります。

public volatile Action Update;

スレッド化に関係なく、メンバーを直接公開するのではなく、プロパティを使用することが常にベスト プラクティスです。次に、プロパティのバッキング ストレージを volatile にする必要があります。これにより、自動プロパティが除外されます。

private volatile Action update;

public Action Update
{
  get { return update; }
  set { update = value; }
}
于 2013-01-10T12:06:07.270 に答える