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();

解决方案 »

  1.   

    我是想通过这个例子了解mutex的waitany 与waitall 的使用与区别
      

  2.   

    AbandonedMutexException 
    http://msdn2.microsoft.com/zh-cn/library/system.threading.abandonedmutexexception(VS.80).aspx老版本的msdn就有如同LZ这样的例子,但是那个例子在Framework2.0下面也是不通过的。
    至于可能的原因请仔细看上面的解释。怕误导了你。自己去理解吧。
      

  3.   

    我发现通不过的原因是因为waitany与waitall两个函数的参数数组里的对象是指向同一个mutex造成的,
    如果:  
         t1Start()  里的 gMs[0]       =       gM2 ==> gMs[0]  =  gM1;   
    就能正常运行,不会有异常,不知道为什么?
       
      

  4.   

    就一错别字,改了能运行:        public   void   t1Start()  
            {  
                    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();  
            }  
    不过可以改进的地方还很多。
      

  5.   

    在线程t1和t3分别调用对应的t1Start()和t3Start()两个方法中,在获取互斥对象后没有显式的释放对应的互斥对象就结束了对应的线程,所以必须在函数执行完之前添加对应的释放语句。
    将以下两个方法做如下红色部分的修改:  
    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();
      }