У меня есть простой класс, такой как:
public class XXX
{
double val1;
double val2;
double delta;
public void SetValues(double v1, double v2)
{
val1 = v1;
val2 = v2;
delta = val1 - val2;
}
public double Val1 { get { return val1; } }
public double Val2 { get { return val2; } }
public double Delta { get { return delta; } }
}
, один поток для установки значений и несколько потоков, которые читают значения.Таким образом, можно использовать lock()
, чтобы все чтение и запись были непрерывными.Но Я знаю, что синхронизация никогда не достигается, всегда есть вероятность, что Val1 - Val2
может быть не равным Delta
, который меня не волнует .Больше всего меня беспокоит получение стабильных значений через геттеры.Однако lock()
стоит дорого для этой ситуации, потому что в основном читатели будут работать.
Следующее лучшее, что приходит мне в голову, это использование Interlocked.Exchange()
public void SetValues(double v1, double v2)
{
Interlocked.Exchange(ref val1, v1);
Interlocked.Exchange(ref val2, v2);
Interlocked.Exchange(ref delta, v1 - v2);
}
public double Val1 {
get
{
double val = 0;
Interlocked.Exchange(ref val, val1);
return val;
}
}
Но код кажется мне довольно глупым.Я не знаю.
Так имеет ли смысл lock()
?Должен ли я использовать Interlocked.Exchange()
для увеличения производительности?Или что еще я могу сделать?