这是正确使用互斥锁吗?

我有一种情况,我可能会同时运行一个程序的多个实例,并且重要的是只有一个特定的函数不能同时在多个这些实例中执行。

这是使用互斥锁来防止这种情况发生的正确方法吗?

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

你说过一个应用程序的多个实例,所以我们说的是两个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将其释放。 如果您只想查看是否创建了Mutex,只需构建它就可以了。

TheSeeker是对的。

Jeff Richter关于锁定的Clr Via C# (p638-9)的建议是创建一个专门用于锁定目的的私有对象。

 private Object _lock = new Object(); // usage lock( _lock ) { // thread-safe code here.. } 

这是有效的,因为_lock不能被当前类之外的任何东西锁定。

编辑:这适用于在单个进程中执行的线程。 @David Mohundro的答案对于进程间锁定是正确的。