这是一个互斥体的正确使用吗?
我有一种情况,我可能同时运行一个程序的多个实例,重要的是只有一个特定的函数不能同时在多个实例中执行。
这是使用互斥锁来防止这种情况发生的正确方法吗?
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来释放它。 如果你只是想看看你是否创建了互斥锁,只需构建它就没问题。
TheSeeker是正确的。
Jeff Richter在Clr Via C#(p638-9)中关于锁定的建议是专门创建一个专用于锁定目的的私有对象。
private Object _lock = new Object();
// usage
lock( _lock )
{
// thread-safe code here..
}
这是有效的,因为_lock不能被当前类以外的任何东西锁定。
编辑:这适用于在单个进程内执行的线程。 @David Mohundro的回答对于进程间锁定是正确的。
链接地址: http://www.djcxy.com/p/51211.html