c# – 我可以避免为我的变化很小的变量使用锁吗?

我一直在阅读Joe Duffy的并行编程书.我有一个关于无锁线程的学术问题.

第一:我知道无锁线程充满危险(如果你不相信我,阅读书中有关内存模型的部分)

不过,我有一个问题:
假设我有一个带有int属性的类.

此属性引用的值将被多个线程非常频繁地读取

值非常罕见,值会发生变化,而且它会改变它的一个线程.

如果使用它的另一个操作正在飞行中,则会改变,否则任何人都不会丢失手指(任何使用它的人首先将其复制到本地变量)

我可以使用锁(或者一个readerwriterlockslim来保持读取并发).
我可以标记变量volatile(很多例子)

然而,即使是挥发性也可能会导致性能下降.

如果在更改时使用VolatileWrite,并使读取的访问权限保持不变.这样的事情

public class MyClass
{
  private int _TheProperty;
  internal int TheProperty
  {
    get { return _TheProperty; }
    set { System.Threading.Thread.VolatileWrite(ref _TheProperty, value); }
  }
}

我不认为我会在现实生活中尝试过这个,但是我对这个答案很好奇(比起任何事情,作为一个检查点,我是否理解我一直在阅读的内存模型的东西).

将变量标记为“volatile”有两个效果.

1)读取和写入具有获取和释放语义,因此对于该内存位置的读取和写入,其他内存位置的读取和写入将不会“及时向前和向后移动”. (这是一个简化,但是你可以点我的观点.)

2)由抖动产生的代码不会“缓存”一个似乎在逻辑上不变的值.

前一点是否与您的情景相关,我不知道;你只描述了一个内存位置.无论重要的是你只有挥发性的写入,但不是挥发性的读取是由你决定的.

但在我看来,后一点是相当相关的.如果在非易失性变量上有自旋锁:

while(this.prop == 0) {}

抖动在其生成此代码的权利内,就像您写的一样

if (this.prop == 0) { while (true) {} }

无论是否这样做,我不知道,但它有权利.如果你想要的是代码实际上重新检查每个循环的属性,将其标记为volatile是正确的方法.

翻译自:https://stackoverflow.com/questions/2158001/can-i-avoid-using-locks-for-my-seldomly-changing-variable

转载注明原文:c# – 我可以避免为我的变化很小的变量使用锁吗?