[英]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塊中運行,因此不可中止。
是否有可能在此級別發生異常,使對象仍處於鎖定狀態?
不會。線程中止將被延遲,直到控制離開最終。 解鎖有效鎖不會分配內存或拋出另一個異常。
引發此異常時,運行時會在結束線程之前執行所有finally塊
(這包括調用Thread.Abort
時當前正在執行的任何finally
塊)
所以是的,鎖定將被釋放。 這是否可取是一個非常不同的問題 - 你不知道線程即將釋放鎖 - 它可能在任何地方,並且可能正在改變鎖保護的狀態 - 一如既往,建議是避免Thread.Abort
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.