2

我有一个应用程序创建了一个需要锁定的对象,因为该对象创建了一个外部硬件设备对象(通过第三方 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;   
        }
    }
}
4

1 回答 1

2

我想您应该使用命名互斥锁(请参阅 MSDN 上的这篇文章)。

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

所以,尝试使用这个构造函数来创建一个命名的 Mutex。除了你应该检查它是否已经存在于Mutex.OpenExisting 方法(考虑这篇文章中给出的例子;它告诉如何检查、创建、利用一个命名的互斥锁)。

编辑

互斥类

您可以使用 WaitHandle.WaitOne 方法来请求互斥体的所有权。拥有互斥锁的线程可以在对 WaitOne 的重复调用中请求相同的互斥锁,而不会阻塞其执行。但是,线程必须调用 ReleaseMutex 方法相同的次数才能释放互斥锁的所有权。Mutex 类强制执行线程标识,因此互斥锁只能由获取它的线程释放。

Mutex Constructor (Boolean, String),也就是说,必须将 bool 参数设置为:

如果命名系统互斥体是作为此调用的结果创建的,则为调用线程授予命名系统互斥体的初始所有权;否则为假。

于 2012-09-18T01:07:35.050 回答