Глава.30 .Гибридные.конструкции.синхронизации.потоков
С этой конструкцией связан ряд концепций, заслуживающих отдельного упо-
минания. Во-первых, конструктору
ReaderWriterLockSlim
можно передать флаг
LockRecurionsPolicy
, определенный следующим образом:
public enum LockRecursionPolicy { NoRecursion, SupportsRecursion }
Флаг
SupportsRecursion
наделяет код блокирования механизмом владения по-
током и рекурсивным поведением. Как уже упоминалось в этой главе, эти режимы
негативно влияют на производительность блокирования, так что я рекомендую
всегда передавать конструктору флаг
LockRecursionPolicy.NoRecursion
(как
это сделано в моем примере). Поддержка режимов владения потоком и рекурсии
для блокирования на чтение-запись является крайне дорогим удовольствием, ведь
при блокировании нужно отслеживать все блокируемые потоки, занимающиеся
чтением данных, и поддерживать для каждого из них отдельный счетчик рекурсии.
На самом деле для управления всей этой информацией в безопасном в отношении
потоков режиме конструкция
ReaderWriterLockSlim
внутренне использует взаи-
моисключающее блокирование с зацикливанием! И я не шучу.
Класс
ReaderWriterLockSlim
содержит дополнительные методы (ранее они не
демонстрировались), позволяющие читающему потоку превратиться в поток за-
писывающий. Затем возможен обратный переход. В основе такого подхода лежит
идея, что в процессе чтения данных потоком может возникнуть необходимость
их редактирования. Поддержка данного поведения снижает производительность
блокирования. Ну а я так вообще считаю его бесполезным. Дело в том, что поток не
может просто так превратиться из читающего в пишущий. Перед тем как он получит
позволение на подобное преобразование, все остальные читающие потоки должны
покинуть код блокирования. Это то же самое, что поток чтения, освобождающий
блокировку и тут же получающий ее для записи.
ПриМеЧание
В.FCL.также.присутствует.конструкция.ReaderWriterLock,.появившаяся.еще.в.Microsoft.
NET.Framework.1 0 .Она.была.настолько.проблемной,.что.в.версию.3 5.разра-
ботчики.Microsoft.ввели.конструкцию.ReaderWriterLockSlim .Менять.конструкцию.
ReaderWriterLock.они.не.стали,.чтобы.не.потерять.совместимости.с.использующими.
ее.приложениями .Данная.конструкция.работает.крайне.медленно.даже.в.отсутствии.
конкуренции.потоков .Она.не.позволяет.отказаться.от.владения.потоком.и.рекурсив-
ного.поведения,.еще.сильнее.замедляющих.блокирование .Потоки.чтения.имеют.
в.этой.конструкции.приоритет.перед.потоками.записи,.что.может.привести.к.про-
блемам.типа.«отказ.в.обслуживании»
Do'stlaringiz bilan baham: |