Нужно ли вообще блокировать геттеры и сеттеры, когда несколько потоков будут обращаться к свойству / полю через get / set-functions.
Например:
У вас есть таймер, который регулярно получает значение объекта. И процесс, который регулярно обновляет это значение.
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.
- Если да, то почему?
- Требуется ли в этом случае энергозависимость (при условии, что одно или несколько ядер процессора)
- Для простоты предположим, что свойства / поля из Progress доступны только для чтения. РЕДАКТИРОВАТЬ: я знаю, что + = и т. д. не являются атомарными операциями и требуют правильной обработки (например, блокировки)
Я бы подумал, что установка и чтение из переменной _progress - это атомарная операция. Не важно, что GetProgress получит самое актуальное значение. Если не в этот раз, он получит его при следующем вызове GetProgress.