C#互锁function作为锁机制?

当我读到有关ReaderWriterLockSlim锁定机制时, 有人提出Interlock Functions可用于更精细的锁定

另外,我在这里找到了 Marc的另一个答案:

…写入对克隆副本进行更改,然后使用Interlocked.CompareExchange交换引用(如果另一个线程在临时中突变了引用,则重新应用它们的更改)。

好吧,目前我所知道的Interlocked对象,就是它(在multithreading环境中)用来做primefacesadditionscomparecomparecompareExchange操作。 (我知道如何使用它)

但是( 这是我的问题 ) –

我如何将其用作 ? (示例代码将非常感谢)

编辑

为简单起见,我粘贴了这段代码( 这不是线程安全的 – 如果同时由两个线程调用Go ,则可能会得到一个被零除错误 ):

 class ThreadUnsafe { static int _val1 = 1, _val2 = 1; static void Go() { if (_val2 != 0) Console.WriteLine (_val1 / _val2); _val2 = 0; } } 

如何使用互锁来替换锁(这可以解决问题)?

Interlocked用于实现无锁算法和数据结构。 因此,它不是“更精细的锁定”,甚至根本不是锁定。 它允许您在multithreading环境中安全地执行小型且定义良好的操作:例如,如果您希望两个线程增加相同的变量,您可以使用Interlocked来执行此操作, 而不是获取重量级锁并使用“常规”增量”。

但是,你可以在常规锁定下使用Interlocked做很多很多事情。 例如,任何涉及以primefaces方式修改多个变量的内容通常无法使用Interlocked完成,因此您无法将其用于示例。

但是, Interlocked可以帮助开发人员实现锁定机制,尽管您也可以使用内置锁定机制。 大多数锁需要内核支持才能中断被阻塞的线程,直到锁变为可用。 因此,单独使用Interlocked可以实现的唯一一种锁是自旋锁:线程不断尝试获取的锁直到它工作。

 class InterlockedLock { private int locked; public void Lock() { while (Interlocked.CompareExchange(ref locked, 1, 0) != 0) continue; // spin } public void Unlock() { locked = 0; } } 

在此示例中, locked最初为零。 当一个线程第一次尝试获取它时, locked变为1,后续线程试图Lock它将旋转,直到有人调用Unlock再次locked 0。

使用Interlocked锁定是通过仅在旧值未更改时使用旧值替换新值来完成的。 如果有,我们再试一次,直到它没有(旋转)。

这可以用来替换只更新单个值或实现像SpinLock这样的轻量级锁定机制的细粒度锁。

示例

 private int _value; int oldValue; int originalValue; do { oldValue = _value; originalValue = Interlocked.CompareExchange(ref _value, newValue, oldValue); } while (originalValue != oldValue); 

而不是

 lock(_lock) { _value = newValue; }