我需要一個與Monitor類似的同步原語,但不需要像輸入它那樣多次退出它。如果我通過一個線程輸入Monitor,然後通過同一個線程重新輸入它,我需要兩次調用Monitor.Exit。但我需要通過一個電話退出它。同步原語「鎖定一次」
現在我使用某種類型的Monitor包裝器,如果它已經被當前線程輸入(並且這就是爲什麼然後我可以通過一個調用退出它),它不會進入Monitor。但是可能是.NET Framework包含一個?
我需要一個與Monitor類似的同步原語,但不需要像輸入它那樣多次退出它。如果我通過一個線程輸入Monitor,然後通過同一個線程重新輸入它,我需要兩次調用Monitor.Exit。但我需要通過一個電話退出它。同步原語「鎖定一次」
現在我使用某種類型的Monitor包裝器,如果它已經被當前線程輸入(並且這就是爲什麼然後我可以通過一個調用退出它),它不會進入Monitor。但是可能是.NET Framework包含一個?
我很想知道爲什麼你會打電話Monitor.Enter
多次沒有相同數量的電話Monitor.Exit
。通常,任何這樣的同步代碼應該是這樣的:
try
{
Monitor.Enter(lockObject);
// some code that needs to be synchronized
}
finally
{
Monitor.Exit(lockObject);
}
假設你正在使用try
/finally
無論你獲得使用Monitor.Enter
(你應該是),我無法看到你爲什麼會需要一個鎖這是你所問的「鎖定一次」課程。
事實上,你應該基本上不會有反正自己做,作爲一個更簡單的方法,做本質上是相同的就是用一個lock
聲明:
lock (lockObject)
{
// some code that needs to be synchronized
}
這麼說,我當然可以只失去一些東西。
當您需要鎖定第一個條目時,可能會出現遞歸函數的情況。 – vines 2014-04-03 11:11:04
你怎麼知道它是相同的線程,以及如何確保當這個線程離開它將在它離開之前調用退出?
從外觀上看,你只需要別的東西(在外層)鎖定。也許是一種「入口點」方法,它可以鎖定和調用具有工作內容的另一種方法,然後您可以多次調用這個其他方法而不會超過鎖定。
public static void MethodOne()
{
lock (lockObj)
{
MethodTwo();
}
}
private static void MethodTwo()
{
//This method can be called multiple times
//without going past MethodOne and so you only
//lock once
}
private static void MethodThree()
{
}
不是一個答案,但:折返鎖是不是一個好主意...... http://zaval.org/resources/library/butenhof1.html – tiago2014 2011-03-09 06:57:17
微軟允許您配置ReaderWriterLockSlim(例如)要輸入遞歸的,但他們不認爲這是一個好主意。 http://msdn.microsoft.com/en-us/library/system.threading.readerwriterlockslim.aspx – tiago2014 2011-03-09 06:59:23