Csharp/C#教程:C#互锁function作为锁机制?分享


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); 

而不是

上述就是C#学习教程:C#互锁function作为锁机制?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

 lock(_lock) { _value = newValue; } 

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/1012286.html

(0)
上一篇 2021年12月30日
下一篇 2021年12月30日

精彩推荐