- •1. Сборщик мусора и управление ресурсами
- •2. Жизненный цикл объектов
- •3. Неуправляемый код и указатели
- •4. Строки и строковый пул
- •5. Обобщенные типы, ограничения в параметрах обобщенных типов, типы допускающие null значение
- •6. Тип Type и пространство System.Reflection
- •7. Создание объектов с помощью рефлексии, вызов методов объектов средствами рефлексии
- •8. Атрибуты, жизненный цикл объекта атрибута
- •9. Специальные атрибуты net.Framework и ограничения пользовательских атрибутов
- •10. Метаданные сборок, структура сборок, домены приложений
- •11. Многопоточное программирование. Виды многопоточности, обеспечение многопоточности в net.Framework, виды блокировки
- •12. Класс Thread, логические и физические потоки выполнения, жизненный цикл потока выполнения
- •13. Класс монитора, конструкция lock()
- •14. Атомарная синхронизация и класс Interlocked
- •15. Класс ReaderWriterLock, пул потоков
- •16. Классы WaitHandle и производные от него: ManualResetEvent, AutoResetEvent, Mutex
- •17. Высокоуровневые средства распараллеливания задач, класс Task
- •18. Свойства и методы класса Task
- •19. Делегаты, цепочка вызова
- •Групповая адресация
- •20. Асинхронный вызов с помощью объекта делегата
- •IAsyncResult
- •21. События, обратный вызов, типовая схема реализации события
- •22. Лямбда-выражения, замыкание лямбда-выражений
- •23. Деревья выражений, типы деревьев. Создание деревьев выражений
- •24. Технология ado.Net, архитектура, модель с постоянным соединением и с рассоединением
- •Linq to DataSet
- •Linq to sql
- •Платформа ado.Net Entity Framework
- •Службы wcf Data Services
- •25)Понятие поставщика данных и его составные части в ado.Net. Класс соединения, итератора, команды.
- •26. Технология объектно-реляционного связывания, персистентные объекты, на примере одной из технологии (Linq to sql, Linq to Entities, nHibernate)
- •Entity Framework
- •27. Linq to Objects: архитектура технологии и возможности, понятие итератора, создание Linq запросов
- •28. Средства распараллеливания выполнения запросов plinq.
- •29. Основы wcf. Основные понятия, применение. Контракты данных, привязки. Архитектура сервис-ориентированных систем.
- •1) Библиотека с интерфейсом
- •2) Сервер – консольное приложение
- •3) Клиент – консольное приложение
- •30. Структура проекта с использованием wcf сервисов. Интерфейсы сервиса, атрибуты для обозначения методов сервиса и контрактов данных.
- •1) Библиотека с интерфейсом
- •2) Сервер – консольное приложение
- •3) Клиент – консольное приложение
- •31. Методы и свойства прокси-объекта на стороне клиента.
- •32. Развертывание wcf сервисов.
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 находятся в многопоточном апартаменте.
Необходимо иметь стабильную идентификацию, сопоставленную с потоком, или назначить поток задаче.
