lock()在这里有意义吗?
我有一个简单的类,如:
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()
获得性能提升吗?或者我还能做什么?
没有找到相关结果
已邀请:
3 个回复
玖料萄
梦砍废么
读者仍然可以获得不属于一起的Val1,Val2和Delta,因为他们分几步读取它。 您可以将Val1,Val2和Delta放入一个值对象中,该对象可以一次检索并且不会更改:
磐去裸猜饲