DoSync;
" /> DoSync;
" /> DoSync;
" />

首页 / 知识

关于c#:这是否正确使用了互斥锁?

2023-04-14 09:26:00

关于c#:这是否正确使用了互斥锁?

Is this the proper use of a mutex?

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

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

1
2
3
4
5
lock (this.GetType()) {
    _log.Info("Doing Sync");
    DoSync();
    _log.Info("Sync Completed");
}

您说一个应用程序有多个实例,所以我们正在谈论两个program.exe正在运行,对吗? lock语句不会锁定多个程序,而只是锁定在该程序中。如果要使用真正的Mutex,请查看System.Threading.Mutex对象。

这是一个用法示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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)中关于锁定的建议是创建一个专用于锁定的私有对象。

1
2
3
4
5
6
7
private Object _lock = new Object();

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

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

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


互斥锁函数情况运行

最新内容

相关内容

猜你喜欢