我有一个应用程序代码,我在其中使用互斥锁在创建对象期间同步一些代码。对象构造函数获取互斥体,并且仅在不再需要对象时释放它,因此释放互斥体的一个位置将在对象析构函数中。当我使用应用程序的 2 个实例调试代码时,第一个实例首先获取互斥锁,第二个实例坐下来等待 (mut.WaitOne())。用户然后关闭第一个应用程序实例。在这种情况下,第二个实例 mut.WaitOne() 抛出异常:“由于放弃的互斥体,等待已完成。” 这发生在第一个实例中调用 mut.ReleaseMutex() 之前(我知道是因为它在调用 MutexRelease 之前在对象析构函数代码中命中了我的断点)。似乎在调用 ReleaseMutex() 之前释放了互斥锁,从而导致了异常。我将如何解决这种竞争条件?感谢您的帮助。
public sealed class MyObject
{
static ExtDeviceDriver devDrv;
private Mutex mut = new Mutex(false,myMutex);
public MyObject()
{
mut.WaitOne();
//Thread safe code here.
devDrv = new ExtDeviceDriver();
}
~MyObject()
{
mut.ReleaseMutex();
}
}