Описание тега race-condition
Состояние гонки - это когда несколько потоков / процессов / клиентов используют ресурс без надлежащего использования блокировок.
В многопоточных программах условия гонки возникают из-за того, что переключение контекста между потоками часто бывает неустойчивым и непредсказуемым, что часто приводит к изменению общего значения в неподходящее время.
Серверы также уязвимы к условиям гонки, иногда в большей степени, потому что есть много независимых клиентов, которые действуют независимо, а также задержки, вызванные сетевым взаимодействием.
Рассмотрим пример, когда два человека одновременно редактируют один и тот же документ:
- Человек №1 видит неправильную строку. №1 начинает исправлять эту строчку, но работает медленно.
- Человек №2 видит ту же ошибку - пока №1 печатает - и исправляет ее.
- №1 и №2 фиксируют свои отредактированные документы одновременно, без уведомления другого.
- Изменение №1 сначала достигает сервера, и сервер записывает его на диск.
- Изменение №2 попадает на сервер позже, и сервер незаметно перезаписывает изменение №1.
Блокировки - это распространенный способ избежать состояния гонки. Рассмотрим приведенный выше пример с правильной блокировкой:
- Человек №1 видит неправильную строку и начинает ее редактировать.
- Человек №2 также видит неправильную строку, но не может редактировать, пока Человек №1 не отправит свои изменения на сервер.
- Изменения человека №1 видят как №1, так и №2.
- Человек №2 решает, что изменения №1 адекватны, и решает не редактировать.
В этом сценарии доступ к редактированию документа ограничен только одним клиентом. Это препятствует тому, чтобы Человек №2 без уведомления перезаписывал изменения Человека №1. См. Дополнительные примеры в Википедии.