Comments 3
Потоки испортят данные, если процессор переключится на другой поток, когда первый поток еще не завершил запись.
Вообще-то написано что-то невнятное. "Потоки испортят данные" - звучит как утверждение. Но на деле ведь никто ничего не портит, а изменяет, и вообще-то не обязаны что-то конкретное изменять. Я бы, как минимум, написал слово +могут+.
В исходной статье, если я правильно понял контекст, речь вообще идет о бегах и конкуретном доступе из-за бегов. Консистентность операций в принципе является проблемой и не только записи, но и чтения и там так и написано. Но перевод это потерял.
Поток захватывает блокировку и удерживает. Поток не захватит блокировку, если другой поток блокировку удерживает
То что сказано относится только к исключительным блокировкам (mutual locks), как корректно написано в оригинале.
Сущесвуют еще и разделяемые блокировки (shared locks) когда определенные виды доступа не блокируются. Если два потока хотят читать одни и те же данные, разделяемая блокировка вполне может им позволить это делать.
В общем перевод потерял что-то важное.
Да муть какая-то, как пересказ полузабытой теории про потоки с заново придуманными или даже перевранными (от слова врать) терминами
Вы открыли новый смысл термина "политкорректность" - для программирования :) Потоки не портят данные, фу как грубо, они данные только изменяют.
Представьте, поток вмешался в денежные расчеты другого потока и изменил ячейку памяти, а другой поток подмены не заметил и ошибка пошла в результат вычислений. Так данные изменены или испорчены?
"Могут испортить" или "испортят" - невелика разница. Текст учит, как защищать данные от конкурентного доступа. Раз есть вероятность порчи, нужно защищаться - в этом идея.
Консистентность операций в принципе является проблемой и не только записи, но и чтения
Здорово, что вы погружены в тему и легко читаете на английском, но мне кажется, вы не кое-что упустили, когда читали :) Даже в оригинале написано точнее - at least one access is a write
A race is a situation in which a memory location is accessed concurrently, and at least one access is a write. A race is often a sign of a bug, either a lost update (if the accesses are writes) or a read of an incompletely-updated data structure.
Потоки, которые только читают память, не вызывают проблем конкурентного доступа. Потоки, которые конкурируют за запись, уничтожат результаты друг друга - память сохранит только последнюю запись.
Dmitri-D
То что сказано относится только к исключительным блокировкам (mutual locks), как корректно написано в оригинале.
Сущесвуют еще и разделяемые блокировки (shared locks)
Да, вы правы, существуют, но о них здесь не рассказывают :) Прочтите оригинал внимательно. Я понимаю, вы круто разбираетесь в видах блокировок, но эта глава не рассказывает о mutual и shared блокировках и проблеме конкурентных readers и writers - это отдельная тема.
The usual way to avoid races is to use a lock. Locks ensure mutual exclusion, so that only one
CPU at a time can execute the sensitive lines of push
Xv6: учебная Unix-подобная ОС. Глава 6. Блокировки