Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Екзамен з комп. арх..doc
Скачиваний:
4
Добавлен:
17.09.2019
Размер:
449.02 Кб
Скачать

10. Об’єкти синхронізації потоків .Net Monitor та ReaderWriterLock.

public static class Monitor

Класс Monitor контролирует доступ к объектам, предоставляя блокировку объекта одному потоку. Блокировки объектов предоставляют возможность ограничения доступа к части кода. Пока поток владеет блокировкой для объекта, никакой другой поток не может ею завладеть.Следует использовать класс Monitor для блокировки объектов (т. е. ссылочные типы, а не типы значений).

Monitor имеет следующие свойства:

  • Связывается с объектом по требованию.

  • Он несвязан, что означает, что он может быть вызван непосредственно из любого контекста.

  • Невозможно создать экземпляр класса Monitor.

Следующая информация хранится для каждого синхронизированного объекта:

  • Ссылка на поток, который в данный момент владеет блокировкой.

  • Ссылка на очередь готовности, которая содержит потоки, готовые получить блокировку.

  • Ссылка на очередь ожидания, содержащую потоки, ожидающие уведомления об изменении состояния объекта с блокировкой.

Действие

Описание

Enter, TryEnter

Получает блокировку для объекта. Это действие также отмечает начало критической секции. Ни один другой поток не может войти в критическую секцию, пока он выполняет инструкции в критической секции, используя другой объект с блокировкой.

Wait

Освобождает блокировку объекта для того, чтобы разрешить другим потокам осуществлять блокировку и получить доступ к объекту.Вызывающий поток ожидает, пока другой поток не произведет доступ к объекту. Для уведомления ожидающих потоков об изменении состояния объекта используются импульсные сигналы.

Pulse(сигнал),PulseAll

Посылает сигнал одному или более ожидающим потокам. Сигнал уведомляет ожидающий поток о том, что состояние объекта с блокировкой изменилось и владелец блокировки готов освободить ее. Ожидающий поток помещен в очередь готовности объекта, так что в конечном итоге он может получить блокировку для объекта. Когда поток получает блокировку, он может проверить новое состояние объекта для того, чтобы увидеть, было ли достигнуто требуемое состояние.

Exit

Освобождает блокировку объекта. Это действие также отмечает конец критической секции, защищенной объектом с блокировкой.

Следует использовать методы Enter и Exit для того, чтобы пометить начало и конец критической секции. Если критическая секция является набором непрерывных инструкций, тогда блокировка, осуществляемая методом Enter, гарантирует, что только один поток может выполнять обозначенный код, используя объект с блокировкой.

ReaderWriterLock - Определяет блокировку, которая поддерживает один пишущий поток и несколько читающих. IsReaderLockHeld - Возвращает значение, указывающее, владеет ли текущий поток блокировкой чтения. IsWriterLockHeld - те саме для запису. Класс ReaderWriterLock используется для синхронизации доступа к ресурсу. В каждый момент он разрешает или одновременный доступ на чтение для нескольких потоков, или доступ на запись для одного потока. Если ресурс не изменяется часто, класс ReaderWriterLock обеспечивает лучшую пропускную способность, чем простая блокировка по принципу "один поток за раз", например предоставляемая классом Monitor.

Класс ReaderWriterLock работает оптимально, когда большинство обращений к ресурсу производятся для чтения, а операции записи выполняются нечасто и имеют короткую продолжительность. Несколько читающих потоков чередуются с одним записывающим потоком, так что ни те, ни другие не блокируются на длительные периоды времени.

Читающие и пишущие потоки находятся в отдельных очередях. Когда поток освобождает блокировку записи, в тот же момент всем потокам, находящимся в очереди читающих потоков, предоставляются блокировки чтения. Когда все эти блокировки будут освобождены, следующему потоку (если такой существует), ожидающему в очереди записывающих потоков, предоставляется блокировка записи, и т. д. Другими словами, объект ReaderWriterLock переключается между коллекцией читающих и одним записывающим потоком.Пока поток в очереди пишущих потоков ожидает освобождения активных блокировок чтения, потоки, запрашивающие новые блокировки чтения, собираются в очереди читающих потоков. Их запросы не удовлетворяются, даже если они пользуются совместным доступом одновременно с существующими владельцами блокировок чтения; это защищает пишущие потоки от блокировок на неограниченное время читающими потоками.

AcquireReaderLock(Int32) - Получает блокировку чтения AcquireWriterLock(Int32) - Получает блокировку записи. ReleaseLock, ReleaseReaderLock, ReleaseWriterLock - Освобождает блокировку.