使用互斥锁来锁定对象

时间:2012-09-18 01:00:18

标签: c# object mutex

我有一个应用程序,它创建一个需要锁定的对象,因为此对象创建外部硬件设备对象(通过第三方DLL),硬件设备对象只能创建一次。当启动此应用程序的多个实例时,只有第一个实例应该能够创建此C#对象。子序列实例应该看到对象已被锁定且无法创建对象。我使用互斥锁,因为此对象创建发生在多个应用程序实例(多个进程)中。但是,代码不会与互斥锁锁定。我是否运行多个实例,每个实例都创建自己的锁?

public sealed class MyObject
{
    private static MyObject _myObject;
    static ExtDeviceDriver devDrv;
    private readonly static Mutex mut = new Mutex();

    private MyObject()
    {
        mut.WaitOne();
        //Thread safe code here.
        devDrv = new ExtDeviceDriver();
    }

    ~MyObject()
    {
        mut.ReleaseMutex();
    }

    // object accessor
    public static MyObject GetMyObject
    {
        get
        {
            if (_myObject == null)
                _myObject = new MyObject();
            return _myObject;   
        }
    }
}

1 个答案:

答案 0 :(得分:2)

我猜你应该使用命名的互斥锁(See this article on MSDN)。

  

互斥锁有两种类型:本地互斥锁和命名系统互斥锁。如果   使用接受名称的构造函数创建Mutex对象   与该名称的操作系统对象相关联。命名   系统互斥体在整个操作系统中都可见,并且可以   用于同步进程的活动。你可以创建   多个Mutex对象,表示相同的命名系统互斥,和   您可以使用OpenExisting方法打开现有的命名系统   互斥。

因此,请尝试使用此constructor创建一个命名的互斥锁。此外,你应该检查它是否已经与Mutex.OpenExisting Method一起存在(考虑本文中给出的例子;讲述如何检查,创建,利用命名的互斥锁)。

修改

请参阅Mutex Class

  

您可以使用WaitHandle.WaitOne方法请求a的所有权   互斥。拥有互斥锁的线程可以请求相同的互斥锁   重复调用WaitOne而不阻止其执行。然而   线程必须调用ReleaseMutex方法的次数相同   释放互斥锁的所有权。 Mutex类强制执行线程   身份,因此互斥锁只能由获得的线程释放   它

并且Mutex Constructor (Boolean, String)表示必须将bool参数设置为:

  

如果给出调用线程,则为true   如果命名系统互斥锁,则命名系统互斥锁的初始所有权   是由于此调用而创建的;否则,错误。