Pull to refresh

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

Sign up to leave a comment.

Articles