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

11. Об’єкти синхронізації потоків .Net lock та ManualResetEvent.

lock

За допомогою ключового слова lock, блок операторів можна помітити, як важливий фрагмент, отримавши блокування взаємного виключення, виконавши оператор, і пізніше знаяти блокування. Оператор має наступний вигляд:

Object thisLock = new Object(); lock (thisLock) { // Critical code section. }

Ключове слово lock не дозволить одному потоку здійснити доступ до критичної секції коди, поки в ньому знаходиться інший потік. При спробі входження іншого потоку в критичну секцію, потрібно буде дочекатися зняття блокування об’єкта.

Будь-який об’єкт, який доступний потокам, що взаємодіють, може бути використаним як об’єкт синхронізації, якщо це об’єкт типу посилання.

ManualResetEvent

ManualResetEvent дозволяє потокам взаємодіяти один з одним шляхом передачі сигналів. Зазвичай ця взаємодія стосується завдання, яку один потік повинен завершити до того, як інший продовжить роботу.

Коли потік починає роботу, яка повинна бути завершена до продовження роботи інших потоків, він викликає метод Reset для того, щоб помістити ManualResetEvent в несигнальний стан. Цей потік можна розуміти як контролюючий ManualResetEvent. Потоки, які викликають метод WaitOne в ManualResetEvent, будуть заблоковані, очікуючи сигналу. Коли контролюючий потік завершить роботу, він викличе метод Set для повідомлення про те, що очікуючі потоки можуть продовжити роботу. Всі очікуючі потоки звільняються.

Можна контролювати початковий стан ManualResetEvent, передавши конструктору логічне значення, значення true, якщо початковий стан сигнальне, і false, в іншому випадку.

Події ManualResetEvent можна також використовувати з методами WaitAll і WaitAny, поміченими модифікатором static.

Основні методи:

WaitOne - Блокує поточний потік до отримання сигналу об'єктом WaitHandle.

Set - Задає сигнальний стан події, дозволяючи одному або декільком очікуючим потокам продовжити.

Reset - Задає несигнальний стан події, викликаючи блокування потоків.

12. Об’єкти синхронізації потоків .Net AutoResetEvent та Mutex.

AutoResetEvent позволяет потокам взаимодействовать друг с другом путем передачи сигналов. Как правило, этот класс используется, когда потокам требуется исключительный доступ к ресурсу.

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

Вызов Set сигнализирует событию AutoResetEvent о необходимости освобождения ожидающего потока. Событие AutoResetEvent остается в сигнальном состоянии до освобождения одного ожидающего потока, а затем возвращается в несигнальное состояние. Если нет ожидающих потоков, состояние остается сигнальным бесконечно.

Если поток вызывает метод WaitOne, а AutoResetEvent находится в сигнальном состоянии, поток не блокируется. AutoResetEvent немедленно освобождает поток и возвращается в несигнальное состояние.

Можно контролировать начальное состояние AutoResetEvent, передав конструктору логическое значение; если начальное состояние сигнальное, значение true, в противном случае значение false.

Событие AutoResetEvent можно также использовать с методами WaitAll и WaitAny, помеченными модификатором static.

Mutex

Мьютекс обеспечивает те же самые функциональные возможности, что и оператор lock в C#, что делает его не очень востребованным. Единственное преимущество состоит в том, что Mutex доступен из разных процессов, обеспечивая блокировку на уровне компьютера, в отличии от оператора lock, который действует только на уровне приложения.

Метод WaitOne для Mutex получает исключительную блокировку, блокируя поток, если это необходимо. Исключительная блокировка может быть снята вызовом метода ReleaseMutex. Точно также как оператор lock в C#, Mutex может быть освобожден только из того же потока, что его захватил.

Типовое использование мьютекса для взаимодействия процессов – обеспечение возможности запуска только одного экземпляра программы единовременно.