DoSync;
"/>

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

关于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的答案对于进程间锁定是正确的。


推荐阅读

    excel怎么用乘法函数

    excel怎么用乘法函数,乘法,函数,哪个,excel乘法函数怎么用?1、首先用鼠标选中要计算的单元格。2、然后选中单元格后点击左上方工具栏的fx公

    excel中乘法函数是什么?

    excel中乘法函数是什么?,乘法,函数,什么,打开表格,在C1单元格中输入“=A1*B1”乘法公式。以此类推到多个单元。1、A1*B1=C1的Excel乘法公式

    标准差excel用什么函数?

    标准差excel用什么函数?,函数,标准,什么,在数据单元格的下方输入l标准差公式函数公式“=STDEVPA(C2:C6)”。按下回车,求出标准公差值。详细

    计算机正常运行中死机故障的解决

    计算机正常运行中死机故障的解决,,通常有三个问题,如黑屏、花屏和蓝屏。 故障1:散热 拆卸机箱、使用皮老虎、冷发等工具来清理机箱内的灰尘

    excel常用函数都有哪些?

    excel常用函数都有哪些?,函数,哪些,常用,1、SUM函数:SUM函数的作用是求和。函数公式为=sum()例如:统计一个单元格区域:=sum(A1:A10)  统计多个