簡體   English   中英

鎖定語句 - 是否始終釋放鎖定?

[英]Lock statement - does it always release the lock?

我最近閱讀了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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM