Ожидание условия Monitor Wait в C#
Метод Monitor.Wait освобождает монитор и ждёт Pulse; условие проверяют в цикле while.
Поток могут разбудить без реального сигнала. Поэтому флаг проверяют в цикле снова, а не один раз после пробуждения.
Строка "go" появится только после сигнала. Ждущий поток не выйдет из цикла, пока ready равен false, даже если его разбудили зря:
object gate = new();
bool ready = false;
Thread waiter = new(() =>
{
lock (gate)
{
while (!ready) Monitor.Wait(gate);
Console.WriteLine("go"); // выведет go
}
});
waiter.Start();
lock (gate)
{
ready = true;
Monitor.Pulse(gate);
}
waiter.Join();
Заставьте один поток ждать, пока общее поле не станет строкой "open". Во втором потоке запишите эту строку и разбудите ждущего. После пробуждения выведите поле в консоль.