0

2 つの名前付きミューテックスを使用して相互排除を実現するにはどうすればよいですか? 次のコードは機能するはずですが、機能しません。

    [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 を使用して、同じ名前を参照する 2 つのミューテックス ハンドルがあることを確認しました。これはうまくいくはずです...何が欠けていますか?

4

1 に答える 1

3

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();
        }
于 2012-02-24T15:27:13.523 に答える