1

モニタークラスのパルスとウェイトについて質問です。以下はコードの抜粋です。私の質問は、コードが動かなくなることです

// <<----------

ロッカーが空くまで?

     {
        check = false;
        new Thread(pulseWaitFun).Start();

        Console.Writeline("Threading tutorial");

        lock (locker) // <<-----------
        {
            check = true;
            Monitor.Pulse(locker);
        }
        Console.ReadLine();
    }

    static void pulseWaitFun()
    {
        lock (locker)
        {
            if(check != true)
            {
                Thread.Sleep(20000);
                Monitor.Wait(locker);

            }
        }

        Console.WriteLine("Woken !!");
    }

2 番目の質問Monitor.Pulse(locker);です。次の実行シーケンスはどうなりますか?

4

2 に答える 2

3

私の質問は、ロッカーが解放されるまで、コードは...にスタックしますか?

はいlock() {}。ただし、ブロックを終了するか、.Wait()

Monitor.Pulse(ロッカー)の後; 次の実行シーケンスはどうなりますか?

コードでは、シーケンスは次のようになります。

  1. Thread(pulseWaitFun).Start();
  2. lock (locker)、競合していないため、ロックはすぐに付与されます
  3. Monitor.Pulse(locker);、誰も待っていないため、パルスが無駄になります。
  4. lock()メインメソッドで終了
  5. 2番目のスレッドの実行が開始されます...

スレッドを開始した後、おそらくThread.Sleep(100)内部 Main() が必要です。

于 2013-03-06T13:48:51.530 に答える
1

どのロックが最初に呼び出されるかを推測することはできません。2 つのオプションを考えてみましょう。

  • メイン メソッドのロックが最初に到達します。チェックはtrueに設定されています。Pulse を呼び出しても効果はありません。次のメイン スレッドがロックを解放し、2 番目のスレッドが pulseWaitFun でそれを取得できます。
  • pulseWaitFun メソッドのロックが最初に到達します。チェックが false であるため、スレッドはスリープ状態になり、ロックを実現するシグナルを待機します。これで、メイン スレッドがロックとパルスを取得します。その後、ロックを解除します。その後、pulseWaitFun を続行できます。
于 2013-03-06T14:03:04.003 に答える