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

15. Класс ReaderWriterLock, пул потоков

ReaderWriterLock - класс

Определяет блокировку, которая поддерживает один пишущий поток и несколько читающих.

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

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

Поток может удерживать блокировку чтения или записи, но не обе одновременно. 

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

Методы:

  • AcquireReaderLock(...) Получает блокировку чтения, используя значение ... для задания времени ожидания.

  • AcquireWriterLock(...) Получает блокировку записи с указанием времени ожидания значением ... .

  • ReleaseLock Освобождает блокировку, независимо от количества ее получений потоком.

  • ReleaseReaderLock Уменьшает на единицу счетчик блокировок.

  • ReleaseWriterLock Уменьшает на единицу счетчик блокировок данной блокировки записи.

  • RestoreLock Возвращает состояние блокировки потока к тому, которое было до вызова метода ReleaseLock.

Пул управляемых потоков

Класс ThreadPool обеспечивает приложение пулом рабочих потоков, управляемых системой, позволяя пользователю сосредоточиться на выполнении задач приложения, а не на управлении потоками. Если имеются небольшие задачи, которые требуют фоновой обработки, пул управляемых потоков — это самый простой способ воспользоваться преимуществами нескольких потоков. Например, начиная с .NET Framework 4, можно создавать объекты Task и Task<TResult>, выполняющие асинхронные задачи в потоках из пула потоков.

Для фоновых задач, взаимодействующих с пользовательским интерфейсом, .NET Framework версии 2.0 также предоставляет класс BackgroundWorker, который работает с помощью событий, созданных в потоке пользовательского интерфейса.

Платформа .NET Framework использует потоки из пула потоков в различных целях, включая асинхронное завершение ввода и вывода, обратные вызовы таймера, зарегистрированные операции ожидания, асинхронные вызовы методов с использованием делегатов и подключения сокетов System.Net.

Когда не следует использовать потоки из пула потоков

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

  • Необходимо наличие основного потока.

  • Поток должен иметь определенный приоритет.

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

  • Необходимо поместить потоки в однопоточный апартамент. Все потоки ThreadPool находятся в многопоточном апартаменте.

  • Необходимо иметь стабильную идентификацию, сопоставленную с потоком, или назначить поток задаче.

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