2014-10-19 105 views
0

我有方法的()中項目乙項目甲互斥C#。如何系統識別互斥碼

和方法B()

我需要兩個方法在互斥

目前我的代碼如下

在項目中

Mutex mutex = new Mutex(fale,"MT"); 
mutex.WaitOne(); 
//SOME LENGTHY CODE 
mutex.ReleaseMutex(); 
在該凸出

ect B我有

Mutex mutex = new Mutex(fale,"MT"); 
mutex.WaitOne(); 
//some different lengthy code 
mutex.ReleaseMutex(); 

我可以看到他的功能作品互相排斥預期。

現在我這裏有

一個 2個問題:我在這兩種方法使用的名字命名爲「MT」。 這就是爲什麼這2個代碼變得相互排斥的原因。

即使我使用不同的名字,這兩個代碼是否相互排斥,是否有任何不同的方式?

兩個:假設項目A上的代碼放在一個無限循環 我如何在b啓動方法(如何避免死鎖)

+1

1.第2名。這是一隻fa魚。當然,你不能期望合理的行爲不合理的代碼。你可以檢測到它,WaitOne()有一個超時,超時。 – 2014-10-19 15:18:55

+1

建議您在前綴「Global \」或「Local \」中明確添加您的互斥體名稱,以清楚您的互斥體是否具有[會話或計算機範圍](http://msdn.microsoft.com/en-us/庫/ system.threading.mutex(v = vs.110)的.aspx)。 – StuartLC 2014-10-19 15:24:47

回答

1

方式Mutex工作是有兩個proceeses?請求所有權對象相同對象,以便第一個獲取它,第二個必須等到第一個釋放它。該名稱是系統用來確定它們是否是「相同」的,因此使用不同的名稱將允許同時訪問兩者(因爲每個人都請求其自己的Mutex的所有權,其他人沒有聲明) 。

關於第二個問題,無限循環並不完全是死鎖,我認爲它不僅僅是第一個進程中的一個錯誤。即使在一個簡單的程序中,這樣的事情也是一個錯誤,程序會崩潰。超時可能會解決這個問題,但如果存在共享資源(這就是爲什麼您首先使用它互斥訪問的原因),則可能會產生另一個問題。我會採取預防措施,首先避免此類錯誤,或者如果它可以合法發生,請儘早釋放Mutex。