我不明白为什么 .NET 互斥锁不会在其中一个等待线程中抛出或在调用AbandonedMutexException
时释放互斥锁。Mutex.Dispose()
特别是,像这样的代码会死锁:
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 互斥体,并且只有在拥有线程死亡的情况下才会触发本机代码 - 我已经编写 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 编程范式的其余部分吗?如果/当开发人员显式销毁锁定的互斥锁时……只有将其标记为已放弃才有意义。