SpinLock .Net 中的结构可用于管理多个线程对资源的访问。与普通锁不同,它使用忙等待,如果预期等待时间非常短(但消耗更多资源),则速度更快。
其他线程原语(例如 Monitor
和 lock(...){}
)始终获取锁(或永远等待获取锁)。但是 SpinLock.Enter
方法使用 ref bool
参数来指示获取锁是否失败。
需要什么 ref bool lockTaken
以及在什么情况下 Monitor.Enter
会失败(从而将 lockTaken
设置为 false ?)
最佳答案
使用此“lockTaken”模式是为了确保线程同步构造确实获取了锁。事情是 - Monitor 和 SpinLock 在 finally block 中内部退出,并在 try block 中获取锁。
现在,如果线程已进入 try block 并在获得锁定之前中止,则不应在 finally block 中释放它。这个问题是通过 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);
}
关于c# - SpinLock.Enter 获取锁失败怎么办?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33165323/