它总是释放锁吗?

我最近从Eric Lippert那里读到关于c#中锁定实现的这篇文章,但仍然存在一些问题。

在4.0实现中,如果在执行finally块中的Monitor.Exit(temp)之前发生线程中止或任何交叉线程异常 - 是否将锁定在对象上?

是否有可能在此级别发生异常,使对象仍处于锁定状态?


在4.0实现中,如果在执行finally块中的Monitor.Exit(temp)之前发生线程中止或任何交叉线程异常 - 是否将锁定在对象上?

让我们来看看这些代码,以便其他读者很清楚:

bool lockWasTaken = false;
var temp = obj;
try 
{ 
  Monitor.Enter(temp, ref lockWasTaken); 
  { 
    body 
  } 
}
finally 
{ 
  if (lockWasTaken) 
  {
    // What if a thread abort happens right here?
    Monitor.Exit(temp); 
  }
}

你的问题是不可回答的,因为它是基于一个错误的假设,即线程中止可能发生在finally块的中间。

线程终止不能发生在finally块的中间。 这仅仅是你为什么不应该试图放弃一个线程的原因之一。 整个线程可以在finally块中运行,因此不会中止。

是否有可能在此级别发生异常,使对象仍处于锁定状态?

不会。线程中止将被延迟,直到控制权离开最后。 解锁一个有效的锁不会分配内存或抛出另一个异常。


阅读关于ThreadAbortException

当引发此异常时,运行时会在结束线程之前执行所有finally

(这包括当调用Thread.Abort时当前正在执行的任何finally块)

所以是的,锁将被释放。 然而,这是否合乎要求是一个非常不同的问题 - 你不知道线程是否即将释放锁 - 它可能在任何地方,并且可能正在改变锁正在保护的状态 - 所以一直建议避免使用Thread.Abort

链接地址: http://www.djcxy.com/p/92165.html

上一篇: does it always release the lock?

下一篇: Lock (Monitor) internal implementation in .NET