C# SpinLock.Enter如何获取锁失败?

C# SpinLock.Enter如何获取锁失败?,c#,.net,multithreading,C#,.net,Multithreading,Net中的结构可用于管理多线程对资源的访问。除了普通锁之外,它使用忙等待,如果预期的等待时间很短(但会消耗更多资源),则会更快 其他线程原语,如监视器和锁(…){}总是获取锁(或永远等待获取锁)。但是SpinLock.Enter方法使用ref bool参数来指示是否获取锁失败 需要什么ref bool locktake以及在什么情况下可以监视。输入fail(并将locktake设置为false?使用此“locktake”模式是为了确保线程同步构造确实占用了锁。问题是-监视器和自旋锁在finall

Net中的结构可用于管理多线程对资源的访问。除了普通锁之外,它使用忙等待,如果预期的等待时间很短(但会消耗更多资源),则会更快

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


需要什么
ref bool locktake
以及在什么情况下可以
监视。输入
fail(并将
locktake
设置为false?

使用此“locktake”模式是为了确保线程同步构造确实占用了锁。问题是-监视器和自旋锁在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);
}

它有助于使SpinLock.Exit()调用异常安全。与Monitor不同,SpinLock本身很容易抛出异常,因为它不是重新进入者。根据MSDN的说法,
SpinLock
上的所有方法都是线程安全的,那么你说它们不可重入是什么意思呢。我理解
ThreadAbortException
now:)的问题。一个线程只能获取一次自旋锁。与其他.NET同步原语(如监视器和互斥)非常不同。如果您获得了锁,然后调用了一个外观无害的方法,该方法也使用了自旋锁,那么您的代码就会死锁或者抛出异常。它是线程安全的,但对代码中的bug不安全。