.Net中的SpinLock结构可用于管理来自多个线程的资源访问。除了正常的锁之外,它使用繁忙的等待,如果预期的等待时间非常短(但消耗更多的资源),这会更快。
其他线程原语(如Monitor
和lock(...){}
)始终获取锁定(或永远等待获取锁定)。但是SpinLock.Enter
方法使用ref bool
参数来指示是否获取锁定失败。
ref bool lockTaken
需要什么,以及在Monitor.Enter
失败的情况下(从而将lockTaken
设置为false?)
答案 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);
}