Зачем использовать блокировку чтения?

Я читал, что блокировка записи является эксклюзивной, а блокировка чтения является общей, поэтому фрагмент кода, который в любом случае находится в блокировке чтения, может быть доступен для нескольких потоков. Что делать, если конфликтующие потоки не получают блокировку чтения? В любом случае они будут только читать. Кроме того, что, если поток, получивший блокировку чтения, попытается что-то записать?

Спасибо


person jayendra bhatt    schedule 28.10.2015    source источник


Ответы (3)


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

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

person Warren Dew    schedule 28.10.2015
comment
Это означает, что блокировка чтения является атомарной. И вы имеете в виду, что для потока, полученного блокировкой чтения, нет препятствий для выполнения операции записи? поправьте меня, если я ошибаюсь - person jayendra bhatt; 28.10.2015
comment
@jayendrabhatt Очень трудно понять ваши вопросы. Как вы думаете, что означает атомарность блокировки? - person David Schwartz; 28.10.2015
comment
@jayendrabhatt, блокировки чтения и записи идут парами: если поток R удерживает блокировку чтения, он блокирует поток W от получения соответствующей блокировки записи, но не блокирует поток S от получения того же чтения замок. Пара блокировок чтения/записи позволяет любому количеству читателей одновременно владеть блокировкой чтения, ИЛИ она позволяет одному писателю владеть блокировкой записи, но никогда не позволяет читатель и писатель одновременно, и он никогда не допускает более одного писателя одновременно. - person Solomon Slow; 28.10.2015

Дублирую здесь комментарий @Solomon Slow, так как это помогло мне лично:

Блокировки чтения и блокировки записи идут парами: если поток R удерживает блокировку чтения, он блокирует поток W от получение соответствующей блокировки записи, но не блокирует поток S от получения такой же блокировки чтения. Пара блокировок чтения/записи позволяет любому количеству читателей «владеть» блокировкой чтения одновременно, ИЛИ позволяет одному писателю владеть блокировкой записи, но никогда не позволяет считывателю и писателю одновременно, и это никогда не позволяет более чем одному писателю одновременно.

person gokareless    schedule 11.02.2019

Это интересно, так как название «readlock» или «reader-lock», вероятно, немного вводит в заблуждение.

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

person theaws.blog    schedule 21.02.2019