2008-09-05 42 views
9

我有一種情況,我可能同時運行一個程序的多個實例,重要的是隻有一個特定的函數不能同時在這些實例中的多個實例中執行。這是一個互斥體的正確使用嗎?

這是使用互斥鎖來防止這種情況發生的正確方法嗎?

lock (this.GetType()) { 
    _log.Info("Doing Sync"); 
    DoSync(); 
    _log.Info("Sync Completed"); 
} 

回答

18

你說一個應用程序的多個實例,所以我們說的是兩個program.exe的運行,對吧?鎖定語句不會鎖定多個程序,只是在程序中。如果你想要一個真正的Mutex,看看System.Threading.Mutex對象。

下面是一個使用示例:

bool createdNew; 
using (Mutex mtx = new Mutex(false, "MyAwesomeMutex", out createdNew)) 
{ 
    try 
    { 
     mtx.WaitOne(); 

     MessageBox.Show("Click OK to release the mutex."); 
    } 
    finally 
    { 
     mtx.ReleaseMutex(); 
    } 
} 

的createdNew變量將讓你知道它是否被創建的第一次。但它只會告訴你它是否已經創建。如果你想獲得鎖,你需要調用WaitOne然後調用ReleaseMutex來釋放它。如果你只是想看看你是否創建了一個互斥鎖,只需構造它就沒問題。

5

TheSeeker是正確的。

Jeff Richter在Clr Via C#(p638-9)上對鎖定的建議是專門爲鎖定目的創建一個專用對象。

private Object _lock = new Object(); 

// usage 
lock(_lock) 
{ 
    // thread-safe code here.. 
} 

這是有效的,因爲_lock不能被當前類以外的任何東西鎖定。

編輯:這適用於在單個進程內執行的線程。 @David Mohundro的回答對於進程間鎖定是正確的。