被遗弃的互斥体异常

我正在尝试首次使用互斥锁,并在程序的两个单独实例上执行以下代码

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

上一篇: Abandoned mutex exception

下一篇: Mutexes with the same name