Читатели - авторитет
В информатике , читатели-автор ( одноразовая блокировка, [ 1 ] Многопользовательский , замок [ 2 ] замок шлюзовой , [ 3 ] или MRSW Lock ) - это примитив синхронизации , который решает одну из задач читателей - авторов . Замок RW обеспечивает параллельный доступ для операций только для чтения, тогда как операции записи требуют исключительного доступа. Это означает, что несколько потоков могут прочитать данные параллельно, но эксклюзивная блокировка для написания или изменения данных необходима . Когда писатель пишет данные, все остальные авторы и читатели будут заблокированы до тех пор, пока писатель не закончит писать. Общее использование может состоять в том, чтобы контролировать доступ к структуре данных в памяти, которая не может быть обновлена атомно и является недействительным (и не должно быть прочитано другим потоком), пока обновление не будет завершено.
Читатели - блокировки автора обычно строятся поверх мутекс и переменных состояния или на вершине семафоров .
Модернизируемый RW Lock
[ редактировать ]Некоторые блокировки RW позволяют атомно обновлять блокировку с заблокированного в режиме чтения до режима записи, а также понижать от режима записи до режима чтения. [1] Обновление блокировки с режима чтения до режима записи склонна к тупикам, поскольку всякий раз, когда два потока, удерживающие блокировки считывателя Читатель блокировка. Можно избежать тупика, позволяя только одному потоку получить блокировку в «режиме чтения с намерением обновить для записи», в то время как в режиме записи нет потоков и, возможно, ненулевых потоков в режиме чтения.
Приоритетная политика
[ редактировать ]RW Locks могут быть разработаны с различными приоритетными политиками для доступа к читателю против писателя. Замок может быть разработан либо для того, чтобы всегда отдавать приоритет читателям ( чтению ), чтобы всегда уделять приоритет авторам ( предпочитающему записи ), либо не указано в отношении приоритета. Эти политики приводят к различным компромиссам в отношении параллелистики и голода .
- Загрязнения RW, которые позволяют получить максимальную параллелию, но могут привести к старту записи, если споры высоки. Это связано с тем, что ветки писателей не смогут приобрести блокировку до тех пор, пока его держит хотя бы одна ветка для чтения. Поскольку несколько потоков считывателей могут удерживать блокировку одновременно, это означает, что ветка писателя может продолжать ждать блокировки, в то время как новые потоки считывателей могут приобрести блокировку, даже до такой степени, что писатель все еще может ждать после всех читателей которые держали замок, когда он впервые попытался приобрести его, выпустили замок. Приоритет читателей может быть слабым , как только что описано или сильное , что означает, что всякий раз, когда писатель выпускает замок, любые блокирующие читатели всегда приобретают его дальше. [ 4 ] : 76
- Заблокированные записи RW. Избегайте проблемы голода писателя, не давая каким-либо новым читателям приобрести замок, если есть писатель в очереди и ожидая блокировки; Автор приобретет замок, как только все читатели, которые уже держали замок, завершены. [ 5 ] Недостатком является то, что блокировки, напоминающие записи, допускают меньше параллелизма в присутствии потоков писателей, по сравнению с чтениями RW Locks. Кроме того, блокировка менее эффективна, потому что каждая операция, принимающая или освобождающая блокировку для чтения или записи, является более сложной, внутренне требуя, чтобы взять и выпускать два мутекса вместо одного. [ Цитация необходима ] Этот вариант иногда также известен как «сборочные» читатели-замок. [ 6 ]
- Неуказанный приоритет RW Locks не предоставляет никаких гарантий в отношении доступа к чтению против записи. Неуказанный приоритет в некоторых ситуациях может быть предпочтительным, если он обеспечивает более эффективную реализацию. [ Цитация необходима ]
Выполнение
[ редактировать ]Существуют несколько стратегий реализации для читателей-авторитет, что сводит их к примитивам синхронизации, которые предполагаются преувеличивать.
Используя два мутекса
[ редактировать ]Raynal демонстрирует, как реализовать блокировку R/W, используя два мутекса и единый целочисленный счетчик. Счетчик, B , отслеживает количество блокирующих читателей. Один мутекс, r , защищает B и используется только читателями; Другой, G (для «глобального») обеспечивает взаимное исключение писателей. Это требует, чтобы мутекс, полученный одним потоком, мог быть выпущен другим. Ниже приведено псевдокод для операций:
Инициализировать
- Установите B на 0 .
- R разблокирован.
- G разблокирован.
Начните читать
- Замок
- Приращение б .
- Если b = 1 , заблокировать g .
- Разблокировать r .
Конец читать
- Замок
- Уменьшение б .
- Если b = 0 , разблокировать g .
- Разблокировать r .
Начните написать
- Замок G.
Конец записи
- Разблокировать g .
Эта реализация получает чтение. [ 4 ] : 76
Используя переменную условия и мутекс
[ редактировать ]В качестве альтернативы блокировка RW может быть реализована в терминах переменной условия , COND , обычного (MUTEX) блокировки, G и различных счетчиков и флагов, описывающих потоки, которые в настоящее время активны или ожидают. [ 7 ] [ 8 ] [ 9 ] Для записи RW Lock можно использовать два целочисленных счетчика и один логический флаг:
- num_readers_active : количество читателей, которые приобрели блокировку (целое число)
- num_writers_waiting : количество авторов, ожидающих доступа (целое число)
- writer_active : Приобрел ли писатель замок (логический).
Первоначально num_readers_active и num_writers_waiting - это ноль, а writer_active - это false.
Операции блокировки и выпуска могут быть реализованы как
Начните читать
- Замок G.
- В то время как num_writers_waiting > 0 или writer_active :
- Подожди , конди , г [ А ]
- При увеличении num_readers_active
- Разблокировать g .
Конец читать
- Замок G.
- DECLEMENT NUM_READERS_ACTICE
- Если num_readers_active = 0 :
- Уведомлять Cond (трансляция)
- Разблокировать g .
Начните написать
- Замок G.
- Increment num_writers_waiting
- В то время как num_readers_active > 0 или writer_active это правда :
- Подожди , конди , г
- DECMENT NUM_WRITERS_WAITING
- SET writer_active на True
- Разблокировать g .
Конец записи
- Замок G.
- Установить writer_active в false
- Уведомлять Cond (трансляция)
- Разблокировать g .
Поддержка языка программирования
[ редактировать ]- POSIX Стандарт
pthread_rwlock_t
и связанные операции [ 10 ] - ReadWritelock [ 11 ] интерфейс и reentertreadwritelock [ 6 ] замки в Java версии 5 или выше
- Microsoft
System.Threading.ReaderWriterLockSlim
Заблокировать для C# и других .NET языков [ 12 ] std::shared_mutex
Читать/записать блокировку в C ++ 17 [ 13 ]boost::shared_mutex
иboost::upgrade_mutex
блокировки в библиотеках Boost C ++ [ 14 ]SRWLock
, добавлено в API операционной системы Windows как Windows Vista . [ 15 ]sync.RWMutex
в ходе [ 16 ]- Фазовая ярмарка чтения - блокировка автора, которая чередуются между читателями и писателями [ 17 ]
std::sync::RwLock
Читать/записать блокировку в ржавчине [ 18 ]- Little :: rwlock в вскоре библиотеки C ++
mse::recursive_shared_timed_mutex
В библиотеке SAFERCPLUSPLUS находится версияstd::shared_timed_mutex
это поддерживает семантику рекурсивной собственностиstd::recursive_mutex
.txrwlock.ReadersWriterDeferredLock
Читатели/писатель блокировки для Twisted [ 19 ]rw_semaphore
в ядре Linux [ 20 ]
Альтернативы
[ редактировать ]Алгоритм чтения-copy-update (RCU) является одним из решений проблемы читателей-авторов. RCU не в состоянии ожидания для читателей. Ядра Linux реализует специальное решение для нескольких авторов под названием Seqlock .
Смотрите также
[ редактировать ]- Семфор (программирование)
- Взаимное исключение
- Планировщик шаблон
- Балансировка схема
- Блокировка файлов
- Замок (информатика)
- Читатели - Авторы. Проблема
Примечания
[ редактировать ]- ^ Это стандартная операция «ожидание» на переменных условия, которая, помимо прочего, выпускает мутекс g .
Ссылки
[ редактировать ]- ^ Гамильтон, Даг (21 апреля 1995 г.). "Предложения для блокировки с несколькими читателями/однонаправленным?" Полем Группа новостей : comp.os.ms-windows.nt.misc . USENET: [Электронная почта защищена] . Получено 8 октября 2010 года .
- ^ "Практическая фритхня блокировки" Keir Fraser 2004
- ^ "Толкающие замки - что они?" Полем Блог ntdebugging . Блоги MSDN. 2 сентября 2009 г. Получено 11 мая 2017 года .
- ^ Подпрыгнуть до: а беременный Raynal, Michel (2012). Одновременное программирование: алгоритмы, принципы и основы . Спрингер.
- ^ Стивенс, В. Ричард ; Раго, Стивен А. (2013). Усовершенствованное программирование в среде UNIX . Аддисон-Уэсли. п. 409
- ^ Подпрыгнуть до: а беременный
java.util.concurrent.locks.ReentrantReadWriteLock
Java Readers - Авторская реализация блокировки предлагает «справедливый» режим - ^ Херлихи, Морис; Shavit, NIR (2012). Искусство многопроцессорного программирования . Elsevier. С. 184–185.
- ^ Николс, Брэдфорд; Баттлар, Дик; Фаррелл, Жаклин (1996). Программирование Pthreads: стандарт POSIX для лучшей многопроцессы . О'Рейли. С. 84–89 . ISBN 9781565921153 .
- ^ Бутенхоф, Дэвид Р. (1997). Программирование с потоками POSIX . Аддисон-Уэсли. С. 253–266.
- ^ «Выпуск 6 -го базового спецификации группы 6, IEEE STD 1003.1, 2004 Edition: Pthread_rwlock_destroy» . IEEE и открытая группа . Получено 14 мая 2011 года .
- ^
java.util.concurrent.locks.ReadWriteLock
- ^ «CreaterWriteLockslim Class (System.Threading)» . Microsoft Corporation . Получено 14 мая 2011 года .
- ^ «Новая принятая статья: N3659, общая блокировка в C ++ - Говард Хиннант, Детлеф Воллманн, Ханс Бем» . Стандартный фундамент C ++.
- ^ Энтони Уильямс. «Синхронизация - повышение 1.52.0» . Получено 31 января 2012 года .
- ^ Алессандрини, Виктор (2015). Программирование приложений для приложений общей памяти: концепции и стратегии в многоядерном прикладном программировании . Морган Кауфманн.
- ^ «Язык программирования GO - синхронизация пакета» . Получено 30 мая 2015 года .
- ^ «Синхронизация читателя-автора для многопроцессорных систем в режиме реального времени» (PDF) .
- ^ "std :: sync :: rwlock - ржавчина" . Получено 26 октября 2019 года .
- ^ «Читатели/писатель -блокировка для Twisted» . GitHub . Получено 28 сентября 2016 года .
- ^ «Примитивы синхронизации в ядре Linux: Semaphores Reader/Writer» . Linux Insides . Получено 8 июня 2023 года .