Roy*_* T. 5 .net c# multithreading
.Net 中的SpinLock结构可用于管理从多个线程对资源的访问。除了普通锁,它使用忙等待,如果预期等待时间非常短(但消耗更多资源),则速度更快。
其他线程原语,例如 aMonitor和lock(...){}总是获取锁(或永远等待获取它)。但是该SpinLock.Enter方法使用一个ref bool参数来指示获取锁是否失败。
什么是ref bool lockTaken需要的,并在何种情况下可以Monitor.Enter失败(因此设置lockTaken为false?)
使用此“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)