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

9. Характеристика засобів синхронізації потоків та процесів .Net Framework.

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

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

Для простых операций над числовыми типами данных синхронизация потоков выполняется с помощью членов класса Interlocked.

Lock

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

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

Мониторы

Мониторы не допускают одновременное выполнение несколькими потоками одних и тех не блоков кода. Метод Enter позволяет только одному методу переходить к последующим операторам, все прочие методы заблокированы, пока выполняемый метод не вызовет Exit.

События синхронизации и дескрипторы ожидания

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

Существует два типа событий синхронизации: AutoResetEvent и ManualResetEvent. Отличие только одно: AutoResetEvent автоматически изменяется с состояния с сигналом на состояние без сигнала всегда при активации потока. В отличие от него, ManualResetEvent позволяет активировать состоянием с сигналом любое количество потоков, и вернется в состояние без сигнала только при вызове своего метода Reset.

Потоки можно заставить дожидаться определенных событий, вызвав один из методов ожидания, например WaitOne, WaitAny или WaitAll.WaitHandle.WaitOne() приводит к ожиданию потока до тех пор, пока единственное событие не становится сигнализирующим, WaitHandle. WaitAny() блокирует поток до тех пор, пока одно или несколько указанных событий не становятся сигнализирующими, и WaitHandle.WaitAll() блокирует поток до тех пор, пока все указанные события не становятся сигнализирующими.