Я в дикой природе и наткнулся на следующий фрагмент кода в конструкторе:
lock (_lock)
while (0 != x)
Monitor.Wait(_lock);
Я не совсем уверен, что это делает, и цель этого. Я читал о Monitor.Wait,
Когда поток вызывает Wait, он снимает блокировку с объекта и входит в очередь ожидания объекта. Следующий поток в очереди готовности объекта (если он есть) получает блокировку и использует объект исключительно.
Итак, допустим, я заблокировал поток _lock
. Хотя (x! = 0), где x
, скорее всего, обновляется другим потоком. Я выпускаю x для обновления, оно обновляется следующим потоком в очереди, и затем я могу свободно проверять x != 0
после того, как другой поток снял свою блокировку над x
?
Более того , что, если в готовой очереди нет потока? Я вижу, как Monitor.Pulse(_lock)
вызывается в других частях кода (отдельная функция) как метод, вызванный событием.
lock (_lock)
Monitor.Pulse(_lock);
Заранее спасибо за объяснение.