The SpinLock https://msdn.microsoft.com/en-us/library/system.threading.spinlock(v=vs.110).aspx.Net 中的结构可用于管理多个线程对资源的访问。与普通锁不同,它使用忙等待,如果预期等待时间非常短(但消耗更多资源),则速度更快。
其他线程原语,例如Monitor
and lock(...){}
始终获取锁(或永远等待获取锁)。但是SpinLock.Enter
方法使用一个ref bool
参数来指示获取锁是否失败。
是什么ref bool lockTaken
需要以及在什么情况下可以Monitor.Enter
失败(因此设置lockTaken
为假?)
使用此“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);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)