我有一个应用程序,它创建一个需要锁定的对象,因为此对象创建外部硬件设备对象(通过第三方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;
}
}
}
答案 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 如果命名系统互斥锁,则命名系统互斥锁的初始所有权 是由于此调用而创建的;否则,错误。