SpinLock.Enter 如何获取锁失败?

Roy*_* T. 5 .net c# multithreading

.Net 中的SpinLock结构可用于管理从多个线程对资源的访问。除了普通锁,它使用忙等待,如果预期等待时间非常短(但消耗更多资源),则速度更快。

其他线程原语,例如 aMonitorlock(...){}总是获取锁(或永远等待获取它)。但是该SpinLock.Enter方法使用一个ref bool参数来指示获取锁是否失败。

什么是ref bool lockTaken需要的,并在何种情况下可以Monitor.Enter失败(因此设置lockTaken为false?)

nik*_*ita 6

使用此“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);
}
Run Code Online (Sandbox Code Playgroud)