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


推荐阅读

    linux进程运行命令?

    linux进程运行命令?,系统,工作,状态,地址,信息,进程,基础,命令,管理,软件,lin

    linux命令执行很慢?

    linux命令执行很慢?,软件,系统,工具,分析,机构,服务,培训,教育,数字,数据,Lin

    linux命令行执行py?

    linux命令行执行py?,系统,环境,官网,一致,文件,程序,脚本,源文件,后台,终端,l

    linux查看执行命令?

    linux查看执行命令?,系统,服务,情况,信息,命令,暂停,标准,概念,实时,第一,lin

    linux命令连续执行?

    linux命令连续执行?,连续,通信,工具,数据,代码,命令,设备,系统,发行,情况,如

    linux执行命令卡住?

    linux执行命令卡住?,系统,环境,密码,数据,信息,分析,软件,异常,服务,命令,Lin

    linux显示运行命令?

    linux显示运行命令?,系统,服务,状态,信息,工具,数据,电脑,标准,管理,时间,如

    linux命令执行不动了?

    linux命令执行不动了?,系统,电脑,数据,管理,信息,密码,命令,环境,地方,分析,l

    linux运行vim命令?

    linux运行vim命令?,系统,工具,官方网站,模式,基础,数据,代码,环境,入口,命令

    linux监控命令运行?

    linux监控命令运行?,系统,工作,地址,信息,工具,情况,标准,环境,命令,状态,lin

    linux脚步中执行命令?

    linux脚步中执行命令?,工具,代码,命令,名称,系统,连续,环境,发行,文件,终端,l

    linux后台执行命令?

    linux后台执行命令?,暂停,状态,系统,服务,标准,命令,后台,地方,进程,终端,lin

    linux执行权限命令行?

    linux执行权限命令行?,地址,电脑,系统,数字,工作,权限,目录,文件,新增,信息,L

    linux中命令停止运行?

    linux中命令停止运行?,系统,代码,第一,命令,进程,指令,程序,方法,接线,硬盘,l

    linux命令的执行时间?

    linux命令的执行时间?,时间,系统,周期,信息,命令,设备,环境,地址,基础,进程,l

    程序执行linux命令?

    程序执行linux命令?,系统,工作,地址,环境,信息,管理,命令,文件,目录,程序,lin

    linux执行2个命令?

    linux执行2个命令?,工作,系统,基础,命令,基础知识,信息,管理,在线,概念,第一

    linux自动运行命令?

    linux自动运行命令?,服务,系统,时间,代码,周期性,第一,命令,管理,在线,状态,l

    调用函数命令linux?

    调用函数命令linux?,系统,管理,网络,通用,统一,观察,地址,代码,设备,地方,怎

    linux开启运行命令?

    linux开启运行命令?,系统,服务,工作,管理,状态,命令,标准,情况,环境,工具,lin