Описание тега race-condition

Состояние гонки - это когда несколько потоков / процессов / клиентов используют ресурс без надлежащего использования блокировок.

Состояние гонки - это когда несколько потоков / процессов / клиентов используют ресурс без надлежащего использования блокировок.

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

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

Рассмотрим пример, когда два человека одновременно редактируют один и тот же документ:

  1. Человек №1 видит неправильную строку. №1 начинает исправлять эту строчку, но работает медленно.
  2. Человек №2 видит ту же ошибку - пока №1 печатает - и исправляет ее.
  3. №1 и №2 фиксируют свои отредактированные документы одновременно, без уведомления другого.
  4. Изменение №1 сначала достигает сервера, и сервер записывает его на диск.
  5. Изменение №2 попадает на сервер позже, и сервер незаметно перезаписывает изменение №1.

Блокировки - это распространенный способ избежать состояния гонки. Рассмотрим приведенный выше пример с правильной блокировкой:

  1. Человек №1 видит неправильную строку и начинает ее редактировать.
  2. Человек №2 также видит неправильную строку, но не может редактировать, пока Человек №1 не отправит свои изменения на сервер.
  3. Изменения человека №1 видят как №1, так и №2.
  4. Человек №2 решает, что изменения №1 адекватны, и решает не редактировать.

В этом сценарии доступ к редактированию документа ограничен только одним клиентом. Это препятствует тому, чтобы Человек №2 без уведомления перезаписывал изменения Человека №1. См. Дополнительные примеры в Википедии.