Очередь производителя/потребителя - действительно хороший пример использования для изучения класса Monitor.
Предположим, что работа периодически добавляется в очередь. Иногда есть много предметов, которые нужно обрабатывать, иногда длительные промежутки времени истекают без элементов в очереди.
Итак, предположим, что у вас есть потребительские потоки k, ожидающие обработки элементов в очереди. Другими словами, каждая нить реализует плотный цикл, постоянно пытается
- запрос, чтобы получить
lock
на очереди (это ставит вас в «готовом» очереди монитора).
- Как только вы получите блокировку, проверьте, есть ли в очереди какие-либо предметы. Если нет, у вас есть два варианта освобождения блокировки: a) Вызовите Monitor.Exit, а затем вызовите Monitor.Enter, чтобы поставить себя в очередь «готовой» очереди. b) Или вызовите Monitor.Wait и поставьте себя в очередь ожидания «Монитора».
Если вы выберете опцию «a», ваши потоки k будут тратить циклы ЦП, перемещаясь через готовую очередь снова и снова, не найдя никакой работы и начинать все сначала в задней части очереди.
Если вы выберете вариант «b», вы говорите: «Здесь нет ничего, что можно было бы сделать прямо сейчас, позвольте мне спать и разбудить меня, когда есть что-то делать».
С опцией «b», если очередь пуста, вы скоро найдете всех своих потребителей, спящих в очереди ожидания, и никакое время CPU не будет потрачено впустую.
Затем, когда производитель добавляет элемент в очередь, он вызывает Monitor.Pulse. Это пробуждает первый поток в очереди ожидания, который затем переходит в «готовую» очередь (которая также является передней частью очереди, если «готовая» очередь пуста).
Когда поток получает блокировку и потребляет этот элемент из очереди, он снова вызывает Monitor.Enter и переходит в конец «готовой» очереди.
См. this article для классической реализации очереди производителей/потребителей в .NET.
Вы должны указать контекст. Вы что-то читали, когда пришли к этому вопросу? Если да, ссылку на него или повторить контекст здесь. –
"in .NET" - Какой класс? Монитор? Что-то другое? – mbeckish
Похоже, вы говорите о потоке Windows, а не о .NET. Просьба уточнить. –