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