.NETミューテックスが待ちスレッドの1つにAbandonedMutexException
を投げない、またはMutex.Dispose()
が呼び出されたときにミューテックスを解放しない理由を理解できません。なぜ.NETのミューテックスは破棄されたときにAbandonedMutexExceptionをスローしませんか?
、このようなコードはデッドロックします:
public static void testCall()
{
using (var mutex = new System.Threading.Mutex(false, "testname"))
{
mutex.WaitOne();
Console.WriteLine("second call");
}
}
public static void Main(string[] args)
{
var thread = new System.Threading.Thread(testCall);
using (var mutex = new System.Threading.Mutex(false, "testname"))
{
mutex.WaitOne();
Console.WriteLine("first call");
thread.Start();
System.Threading.Thread.Sleep(new TimeSpan(0, 0, 5));
Console.WriteLine("sleep done");
}
thread.Join();
}
マインドあなたは、私がAbandonedMutexException
を理解し、通常は所有しているスレッドが死ぬ場合にのみトリガーされる基本的なWIN32ミューテックスから来て、ネイティブコードで - I長い間C/C++コードを書いており、基礎をなすデザインを十分に認識しています。私はまた、次のコードは、簡単な回避策であることを知っている:
using (var mutex = new System.Threading.Mutex(false, "testname"))
{
mutex.WaitOne();
try
{
Console.WriteLine("first call");
thread.Start();
System.Threading.Thread.Sleep(new TimeSpan(0, 0, 1));
Console.WriteLine("sleep done");
}
finally
{
mutex.ReleaseMutex();
}
}
私は理解していないことは、オブジェクトが明示的にロックを保持している間に処分されたときのリリースを強制しませ.NETのミューテックスの理論的根拠です。それは.NETプログラミングのパラダイムの他の部分とよりインラインではないでしょうか?開発者がロックされたmutexを明示的に破棄した場合、それを放棄したものとしてマークするだけです。
私は同意しません。コードが例外を処理しない場合、ミューテックスをロックしたコードが意図しない動作(例外)によって失われたため、適切な動作は 'AbandonedMutexException'をスローすることです。私は、 'ReleaseMutex()'は賢明ではないことに気付いていますが、 'AbandonedMutexException'は意味があります。 –
しかし、スレッドが終了しなければ、ミューテックスは放棄されません。 –
いいえ、放棄されたWIN32の意味ではありませんが、例外がスローされ、処理されなかった場合はあなたの例では言いません*と*ミューテックスは破棄されます。 " –