Не понимаю необходимости Monitor.Pulse ()

Согласно MSDN , Monitor.Wait () :

Снимает блокировку на объекте и блокирует текущий поток, пока он восстанавливает замок.

Однако все, что я читал о Wait () и Pulse (), похоже, указывает на то, что простого снятия блокировки с другого потока недостаточно. Мне нужно сначала вызвать Pulse (), чтобы разбудить ожидающий поток.

Мой вопрос: почему? Потоки, ожидающие блокировки на Monitor.Enter (), просто получают ее, когда она освобождается. Не нужно их «будить». Кажется, это лишает возможности Wait ().

например.

static object _lock = new Object();

static void Main()
{
    new Thread(Count).Start();
    Sleep(10);

    lock (_lock)
    {
         Console.WriteLine("Main thread grabbed lock");
         Monitor.Pulse(_lock) //Why is this required when we're about to release the lock anyway?
    }
}

static void Count()
{
    lock (_lock)
    { 
        int count = 0;

        while(true)
        {
            Writeline("Count: " + count++);

            //give other threads a chance every 10th iteration
            if (count % 10 == 0)
                 Monitor.Wait(_lock);
        }
    }
}

Если я использую Exit () и Enter () вместо Wait (), я могу:

static object _lock = new Object();

static void Main()
{
    new Thread(Count).Start();
    Sleep(10);

    lock (_lock) Console.WriteLine("Main thread grabbed lock");
}

static void Count()
{
    lock (_lock)
    { 
        int count = 0;

        while(true)
        {
            Writeline("Count: " + count++);

            //give other threads a chance every 10th iteration
            if (count % 10 == 0)
            {
                 Monitor.Exit(_lock);
                 Monitor.Enter(_lock);
            }
        }
    }
}

23
задан GazTheDestroyer 24 February 2012 в 11:23
поделиться