1、http://msdn2.microsoft.com/zh-cn/library/system.threading.mutex(VS.80).aspx
“出现遗弃的 Mutex 表明存在严重的编码错误。
如果某个线程在未释放互斥体时便退出,受此互斥体保护的数据结构可能处于不一致的状态。
如果此数据结构的完整性能得到验证,下一个请求此互斥体所属权的线程就可以处理此异常并继续。” 在线程里应该成对使用Wait()和ReleaseMutex()。2、你的例子里其实应该用EventWaitHandle或者ManualResetEvent。 static EventWaitHandle eventHandle = new EventWaitHandle(false, EventResetMode.ManualReset);
Mutex.WaitAny(gMs); -》 eventHandle.WaitOne();
gM2.ReleaseMutex(); -》 eventHandle.Set();
“出现遗弃的 Mutex 表明存在严重的编码错误。
如果某个线程在未释放互斥体时便退出,受此互斥体保护的数据结构可能处于不一致的状态。
如果此数据结构的完整性能得到验证,下一个请求此互斥体所属权的线程就可以处理此异常并继续。” 在线程里应该成对使用Wait()和ReleaseMutex()。2、你的例子里其实应该用EventWaitHandle或者ManualResetEvent。 static EventWaitHandle eventHandle = new EventWaitHandle(false, EventResetMode.ManualReset);
Mutex.WaitAny(gMs); -》 eventHandle.WaitOne();
gM2.ReleaseMutex(); -》 eventHandle.Set();
http://msdn2.microsoft.com/zh-cn/library/system.threading.abandonedmutexexception(VS.80).aspx老版本的msdn就有如同LZ这样的例子,但是那个例子在Framework2.0下面也是不通过的。
至于可能的原因请仔细看上面的解释。怕误导了你。自己去理解吧。
如果:
t1Start() 里的 gMs[0] = gM2 ==> gMs[0] = gM1;
就能正常运行,不会有异常,不知道为什么?
{
Console.WriteLine("t1Start started, Mutex.WaitAll(Mutex[])");
Mutex[] gMs = new Mutex[1];
//gMs[0] = gM2;
gMs[0] = gM1;
Mutex.WaitAll(gMs);
Thread.Sleep(2000);
Console.WriteLine("t1Start finished, Mutex.WaitAll(Mutex[])");
Event1.Set();
}
不过可以改进的地方还很多。
将以下两个方法做如下红色部分的修改:
public void t1Start()
{
Console.WriteLine("t1Start started, Mutex.WaitAll(Mutex[])");
Mutex[] gMs = new Mutex[1];
gMs[0] = gM2;
Mutex.WaitAll(gMs);
Thread.Sleep(2000);
Console.WriteLine("t1Start finished, Mutex.WaitAll(Mutex[])");
Event1.Set();
gMs[0].ReleaseMutex();
}
public void t3Start()
{
Console.WriteLine("t3Start started, Mutex.WaitAny(Mutex[])");
Mutex[] gMs = new Mutex[1];
gMs[0] = gM2;
int index = Mutex.WaitAny(gMs);
Event3.Set();
gMs[index].ReleaseMutex();
}