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