2011-11-28 61 views
2

我開發在一箇舊的代碼庫已經在幾個地方下面的代碼:爲什麼我收到「互斥體不屬於」異常

Mutex mutex = new Mutex(false, "<some mutex name>"); 
mutex.WaitOne(); 
try { 
    // do something 
} finally { 
    mutex.ReleaseMutex(); 
} 

這些互斥鎖用於進程內同步,所以我重寫了他們用locks代替,問題似乎消失了。

我知道代碼不是那裏最好的代碼(與What is a good pattern for using a Global Mutex in C#?相比),但是這並不能解釋爲什麼mutex.ReleaseEmutex()偶爾會拋出「互斥量未被擁有」。

所以我問上面的代碼中有什麼缺失(或錯誤),產生異常?

+2

什麼是「//做一些事情」,實際上在做什麼?難道它會釋放互斥鎖(在某些情況下)。 –

+0

在某些情況下,在處理列表(搜索,添加和刪除元素)時使用/在其他情況下通過TCP發送/接收消息。它也被用於鎖定log4net調用,如logger.Debug(「message」)(不太確定爲什麼log4net應該關注鎖定)。 –

+0

如果這確實是代碼,那麼'ReleaseMutex'調用不應該拋出該異常。你確定「做某事」代碼中沒有任何內容釋放互斥嗎?代碼是否總是調用'WaitOne'而不是'WaitOne(timeout)'? –

回答

相關問題