2011-03-09 40 views
1

我需要一個與Monitor類似的同步原語,但不需要像輸入它那樣多次退出它。如果我通過一個線程輸入Monitor,然後通過同一個線程重新輸入它,我需要兩次調用Monitor.Exit。但我需要通過一個電話退出它。同步原語「鎖定一次」

現在我使用某種類型的Monitor包裝器,如果它已經被當前線程輸入(並且這就是爲什麼然後我可以通過一個調用退出它),它不會進入Monitor。但是可能是.NET Framework包含一個?

+1

不是一個答案,但:折返鎖是不是一個好主意...... http://zaval.org/resources/library/butenhof1.html – tiago2014 2011-03-09 06:57:17

+0

微軟允許您配置ReaderWriterLockSlim(例如)要輸入遞歸的,但他們不認爲這是一個好主意。 http://msdn.microsoft.com/en-us/library/system.threading.readerwriterlockslim.aspx – tiago2014 2011-03-09 06:59:23

回答

1

我很想知道爲什麼你會打電話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 
} 

這麼說,我當然可以只失去一些東西。

+0

當您需要鎖定第一個條目時,可能會出現遞歸函數的情況。 – vines 2014-04-03 11:11:04

0

你怎麼知道它是相同的線程,以及如何確保當這個線程離開它將在它離開之前調用退出?

從外觀上看,你只需要別的東西(在外層)鎖定。也許是一種「入口點」方法,它可以鎖定和調用具有工作內容的另一種方法,然後您可以多次調用這個其他方法而不會超過鎖定。

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() 
{ 
}