Mutex对象等待互斥对象的方法有:Mutex.WaitAll、WaitOne、Mutex.WaitAny
使用Mutex对象经常出现的异常现象有:
异常一、
由于出现被放弃的 mutex,等待过程结束
原因:获取互斥对象后没有显式的释放对应的互斥对象就结束了对应的线程
解决办法:每调用一个等待方法,在结束调用时都要调用ReleaseMutex()方法进行Mutex对象释放。而每种释放的方法方式也有点区别。如:
(1)、WaitOne()
Mutex gM1=new Mutex();
gM1.WaitOne();//等待gM1的释放
gM1的释放为:
gM1.ReleaseMutex();
(2)、WaitAll()
Mutex[] gMs = new Mutex[2];
gMs[0] = gM1;
gMs[1] = gM2;
Mutex.WaitAll(gMs); //等待gM1和gM2的释放
for (int i = 0; i < gMs.Length; i++)
{
gMs[0].ReleaseMutex();
}
(3)、WaitAny()
Mutex[] gMs = new Mutex[2];
gMs[0] = gM1;
gMs[1] = gM2;
int index = Mutex.WaitAny(gMs); //等待数组中任意一个Mutex对象被释放
gMs[index].ReleaseMutex();
异常二、
从不同步的代码块中调用了对象同步方法。
此问题是在调用 WaitAny()方法后调用多个释放对象导致的。如:
Mutex[] gMs = new Mutex[2];
gMs[0] = gM1;
gMs[1] = gM2;
Mutex.WaitAny(gMs);
gM1.ReleaseMutex();
gM2.ReleaseMutex();
正确的写法如:
Mutex[] gMs = new Mutex[2];
gMs[0] = gM1;
gMs[1] = gM2;
int index = Mutex.WaitAny(gMs); //等待数组中任意一个Mutex对象被释放
gMs[index].ReleaseMutex();
总结:调用Mutex对象的等待与释放方法要成对出现,调用哪个就要释放哪个。
写的有点俗,请见谅哈