Согласно 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);
}
}
}
}