我有一些代码必须是线程安全的,其行为类似于:
protected long m_RunningValue
protected long m_RunningCounter
protected object m_Lock = new object();
public long RunningValue { get { return Interlocked.Read(m_RunningValue); } }
public long RunningCounter { get { return Interlocked.Read(m_RunningCounter); } }
public void DoCalculation(int newValue, int newQuantity)
{
lock(m_Lock)
{
Interlocked.Add(ref m_RunningValueA, newValue);
Interlocked.Add(ref m_RunningCounter, newQuantity);
if(Interlocked.Read(ref newQuantity) == 0)
{
...m_RunningValue gets further modified here
}
}
}
计算必须同时锁定值和计数器,否则竞争条件可能会影响 if(...) 块,但是它们在被读出时根本不需要同步,即如果计数器和值在尝试阅读两者,这对我来说是 100% 好的。
读取时的互锁用于 64 位值的线程安全读取。
像这样混合联锁和锁安全吗?我在其他网页上读到混合它们是不安全的,但是如果这意味着混合它们是引入细微错误的好方法,或者如果在系统级别这会破坏所涉及的数据结构,我无法找到澄清。
所有这些互锁(64 位 .NET 4.0 运行时)的成本是否完全违背了在属性 get() 方法周围保存 ReaderWriterSlim 锁的目的?