Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
My_shpory_Ivan_Ivanich (2).docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
149.35 Кб
Скачать

16. Классы WaitHandle и производные от него: ManualResetEvent, AutoResetEvent, Mutex

WaitHandle – класс

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

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

Используйте статические методы этого класса для блокирования потока до получения сигнала одним или несколькими объектами синхронизации.

Класс WaitHandle реализует шаблон Dispose. 

Методы:

  1. SignalAndWait(WaitHandle, WaitHandle)

Сигнализирует одному объекту WaitHandle и ожидает другого.

  1. WaitAll(WaitHandle[])

Ожидает получения сигнала всеми элементами заданного массива.

ManualResetEvent – класс

Уведомляет один или более ожидающих потоков о том, что произошло событие. Этот класс не наследуется.

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

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

Когда это было сообщено, ManualResetEvent остается в сигнальном состоянии до того момента, как оно будет снова установлено вручную. То есть, вызовы к WaitOne немедленно возвращаются.

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

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

AutoResetEvent - класс

Уведомляет ожидающий поток о том, что произошло событие. Этот класс не наследуется.

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

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

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

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

Mutex - класс

Примитив синхронизации, который также может использоваться в межпроцессной синхронизации.

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

Можно использовать метод WaitHandle.WaitOne для запроса на владение мьютексом. Поток, владеющий мьютексом, может запрашивать его в повторяющихся вызовах WaitOne без блокировки выполнения. Однако поток должен вызвать метод ReleaseMutex соответственное количество раз для того, чтобы прекратить владеть мьютексом. Класс Mutex выполняет идентификацию потоков, таким образом, мьютекс может освобождаться только потоком, получившим его. Напротив, класс Semaphore не обеспечивает потоковой идентификации.

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

Мьютексы бывают двух типов: локальные мьютексы (без имени), и именованные системные мьютексы. 

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

Именованные системные мьютексы доступны в пределах всей операционной системы и могут быть использованы для синхронизации действий процессов. 

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]