複数のスレッドがget/set関数を介してプロパティ/フィールドにアクセスする場合、一般的にゲッターとセッターをロックする必要がありますか?
例えば:
オブジェクトの値を定期的に取得するタイマーがあります。そして、この値を定期的に更新するプロセス。
public class Task : IProgressProvider
{
...
public Progress GetProgress()
{
// should i lock here?
return _progress;
}
public SetProgress(Progress progress)
{
// and lock here?
_progress = progress;
}
public void Execute()
{
// ...
SetProgress(new Progress(10));
// ...
SetProgress(new Progress(50));
// ...
SetProgress(new Progress(100));
}
}
public class ProgressReporter
{
public ProgressReporter()
{
_timer = new Timer();
_timer.Elapsed += Elapsed;
// ...
}
// ...
public void Elapsed(...)
{
var progress = _task.GetProgress();
// ...
}
}
もう一度質問:
- GetProgress および SetProgress 関数をロックする必要があります。
- はいの場合、なぜですか?
- この場合、揮発性が必要です (1 つまたは複数のプロセッサ コアを想定)
- 「単純」に保つために、Progress のプロパティ/フィールドが読み取り専用であると仮定します。編集: += などはアトミック操作ではなく、適切な処理 (fe ロック) が必要であることを知っています。
変数 _progress の設定と読み取りはアトミック操作だと思います。GetProgress が最新の値を取得することは重要ではありません。今度は GetProgress の次の呼び出しでそれを取得します。