0

2 回目にミューテックスをロックしたときにフローがロックされることを期待して、以下のコードを実行しました。2回実行した後、停止せずに何度もロックできることに気付きました(同じスレッドを想定)。この動作を変更するにはどうすればよいですか?

using System;
using System.Collections.Generic;
using System.Text;

using System.Threading;

namespace Test {
    class Program {
        static volatile Mutex mut1 = new Mutex();
        static volatile Mutex mut2 = new Mutex();
        static void Main(string[] args) {
            mut1.WaitOne(); Console.WriteLine("1W");
            mut2.WaitOne(); Console.WriteLine("2W");
            Thread oThread = new Thread(new ThreadStart(fn2));
            oThread.Start();
            mut1.WaitOne(); Console.WriteLine("1W");
            Console.WriteLine("Second");
            mut1.ReleaseMutex(); Console.WriteLine("1R");
        }
        static void fn2() {
            Console.WriteLine("First");
            mut2.ReleaseMutex(); Console.WriteLine("2R");
            mut1.ReleaseMutex(); Console.WriteLine("1R");
        }
    }
}
4

1 に答える 1

3

まず、ミューテックスを本当に理解しているかどうかはわかりません。最初にロックされたコンテキスト (つまり、スレッド) でのみミューテックスを解放できるため、ある種のガードポイントとして使用することはほとんど意味がありません。

この場合、セマフォを使用する方が理にかなっています。しかし、あなたはまだあなたが本当にやろうとしていることを解決する必要があります:)

システムを使用する;
System.Collections.Generic の使用;
System.Text を使用します。

System.Threading の使用;

名前空間テスト
{
    クラス プログラム
    {
        静的セマフォ sem1 = 新しいセマフォ(1, 1);
        静的セマフォ sem2 = 新しいセマフォ(1, 1);
        static void Main(string[] args)
        {           
            sem1.WaitOne(); Console.WriteLine("1W");
            sem2.WaitOne(); Console.WriteLine("2W");
            スレッド oThread = new Thread(new ThreadStart(fn2));
            oThread.Start();
            sem1.WaitOne(); Console.WriteLine("1W");
            Console.WriteLine("Second");
            sem1.Release(); Console.WriteLine("1R");
        }
        static void fn2()
        {
            Console.WriteLine("最初");
            sem2.Release(); Console.WriteLine("2R");
            sem1.Release(); Console.WriteLine("1R");
        }
    }
}
于 2009-12-13T14:10:14.410 に答える