SpinLock.Enter如何无法获得锁定?

时间:2015-10-16 07:58:38

标签: c# .net multithreading

.Net中的SpinLock结构可用于管理来自多个线程的资源访问。除了正常的锁之外,它使用繁忙的等待,如果预期的等待时间非常短(但消耗更多的资源),这会更快。

其他线程原语(如Monitorlock(...){})始终获取锁定(或永远等待获取锁定)。但是SpinLock.Enter方法使用ref bool参数来指示是否获取锁定失败。

ref bool lockTaken需要什么,以及在Monitor.Enter失败的情况下(从而将lockTaken设置为false?)

1 个答案:

答案 0 :(得分:4)

使用此'lockTaken'模式是为了确保线程同步构造确实采用了该锁。事情是 - Monitor和SpinLock在finally块内部退出,并在try块中进行锁定。

现在,如果线程已进入try块并在锁定之前被中止,那么它不应该在finally块中释放。该问题通过ref bool变量解决。

Boolean taken = false;
try {
    // An exception (such as ThreadAbortException) could occur here...
    Monitor.Enter(this, ref taken);
}
finally {
    if (taken) Monitor.Exit(this);
}