这是互斥锁的正确使用吗?

时间:2020-03-05 18:48:32  来源:igfitidea点击:

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

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

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

解决方案

回答

The Seeker是正确的。

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

private Object _lock = new Object();

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

之所以可行,是因为_lock不能被当前类之外的任何东西锁定。

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

回答

我们说了一个应用程序的多个实例,所以我们谈论的是两个program.exe正在运行,对吧? lock语句不会在多个程序之间锁定,而只会在该程序内锁定。如果要使用真正的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来释放它。如果我们只想查看是否创建了互斥锁,则只需构建即可。