这是一个互斥体的正确使用吗?

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

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

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

上一篇: Is this the proper use of a mutex?

下一篇: Creating Win32 events from c#