被遗弃的互斥体异常
我正在尝试首次使用互斥锁,并在程序的两个单独实例上执行以下代码
public void asynchronousCode()
{
using (var mutex = new Mutex(false, "mySpecialMutex"))
{
if (!mutex.WaitOne(1000, false))
{
Console.WriteLine("First check - some one locked the mutex");
}
if (!mutex.WaitOne(3000, false))
{
Console.WriteLine("Second check- some one locked the mutex");
}
else
{
Console.WriteLine("I got the mutex");
Console.WriteLine("sleeping");
Thread.Sleep(3000);
Console.WriteLine("Awaking and Releasing mutex");
mutex.ReleaseMutex();
}
}
}
当我运行这个时,其中一个实例(我首先运行的那个)打印出来
I got the mutex
sleeping
awaking and releasing mutex
另一个实例打印
First check - some one locked the mutex
一旦第一个实例租用互斥锁,它将在第二个等待语句中崩溃,但例外情况
The wait completed due to an abandoned mutex.
任何想法,为什么我得到这个例外,我怎么可以防止它?
解决方案:我可能应该更清楚地阅读mdsn文档。 感谢安德鲁指引我朝着正确的方向前进
您可以使用WaitHandle.WaitOne方法来请求互斥量的所有权。 拥有互斥锁的线程可以在重复调用WaitOne时请求相同的互斥量,而不会阻止其执行。 但是,该线程必须调用ReleaseMutex方法的次数来释放互斥量的所有权。 互斥体类强制线程标识,因此互斥体只能由获取它的线程释放。
你的问题是你持有互斥锁两次,但只释放一次,因为你如何错误地安排你的if
语句。 你的第一次执行会捕获两次 - 在这两个if
语句中,你的代码只会释放一次。
你需要重新组织if
所以你只能捕获一次互斥量。
bool captured = true;
if (!mutex.WaitOne(1000, false))
{
Console.WriteLine("First check - some one locked the mutex");
captured = false;
}
if (!captured && !mutex.WaitOne(3000, false))
{
Console.WriteLine("Second check- some one locked the mutex");
captured = false;
}
if (captured)
{
Console.WriteLine("I got the mutex");
Console.WriteLine("sleeping");
Thread.Sleep(3000);
Console.WriteLine("Awaking and Releasing mutex");
mutex.ReleaseMutex();
}
我认为你的问题源于using (var mutex = new Mutex(false, "mySpecialMutex"))
行。 当第一个线程终止时,它会处理互斥对象,我相信这会导致你得到的错误。
如果可能的话,最好将该互斥量声明为该方法之外的(静态)类变量。 然后在开始线程之前手动实例化它,并在完成之后处理它。
链接地址: http://www.djcxy.com/p/51219.html