13

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

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 方法相同的次数才能释放互斥锁的所有权。Mutex 类强制执行线程标识,因此互斥锁只能由获取它的线程释放。

4

2 回答 2

19

你的问题是你持有 Mutex 两次,但只释放一次,因为你错误地安排了你的if陈述。您的第一次执行捕获它两次- 在这两个if语句中,但您的代码只释放它一次。

您需要重新组织ifs 以便您只捕获一次互斥锁。

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();
}
于 2012-05-10T18:39:17.103 回答
-2

我认为你的问题出在这using (var mutex = new Mutex(false, "mySpecialMutex"))条线上。当第一个线程终止时,它将处理互斥对象,我相信这可能会导致您遇到错误。

如果可能,最好将互斥锁声明为该方法之外的(静态)类变量。然后,您将在启动线程之前手动实例化它,并在它们完成后将其处理掉。

于 2012-05-10T18:04:06.437 回答