Взаимное исключение не работает с классом .NET Mutex - PullRequest
0 голосов
/ 24 февраля 2012

Как мне добиться взаимного исключения, используя два именованных мьютекса? Следующий код должен работать, но это не так:

    [TestMethod]
    public void xdfgndygfn()
    {
        using (var mutex1 = new Mutex(false, "1234"))
        using (var mutex2 = new Mutex(false, "1234"))
        {
            mutex1.WaitOne();
            mutex2.WaitOne(); //this should block, but it doesn't
        }
    }

Используя Process Explorer, я убедился, что есть два дескриптора мьютекса, ссылающихся на одно и то же имя. Это должно работать ... Чего мне не хватает?

1 Ответ

3 голосов
/ 24 февраля 2012

С MSDN :

Поток, которому принадлежит мьютекс, может запрашивать один и тот же мьютекс при повторных вызовах WaitOne, не блокируя его выполнение.

Вот тест для проверки этого (тест не будет завершен):

        using (var mutex1 = new Mutex(false, "1234"))
        using (var mutex2 = new Mutex(false, "1234"))
        {
            var t1 = new Thread(() =>
                {
                    mutex1.WaitOne();
                    Thread.Sleep(1000000);
                });
            var t2 = new Thread(() =>
                {
                    mutex2.WaitOne();
                    Thread.Sleep(1000000);
                });

            t1.Start();
            t2.Start();

            t1.Join();
            t2.Join();
        }
...