C#互锁function作为锁机制?
当我读到有关ReaderWriterLockSlim
锁定机制时, 有人提出Interlock
Functions可用于更精细的锁定
另外,我在这里找到了 Marc的另一个答案:
…写入对克隆副本进行更改,然后使用Interlocked.CompareExchange交换引用(如果另一个线程在临时中突变了引用,则重新应用它们的更改)。
好吧,目前我所知道的Interlocked
对象,就是它(在multithreading环境中)用来做primefacesadditions
, compare
, compare
, compareExchange
操作。 (我知道如何使用它)
但是( 这是我的问题 ) –
题
我如何将其用作锁 ? (示例代码将非常感谢)
编辑
为简单起见,我粘贴了这段代码( 这不是线程安全的 – 如果同时由两个线程调用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