article

Состоя́ние го́нки (Race condition) — ошибка программирования многозадачной системы, при которой работа системы зависит от того, в каком порядке выполняются части кода.

Простой пример


Рассмотрим пример кода (на Java)

volatile int x;

Поток 1: while (!stop) { x++; ... }

Поток 2: while (!stop) { if (x%2 == 0) System.out.println("x=" + x); ... }

Пусть x=0. Предположим, что выполнение программы происходит в таком порядке:

  1. if в потоке 2 проверяет x на чётность.
  2. Оператор «x++» в потоке 1 увеличивает x на единицу.
  3. Оператор вывода в потоке 2 выводит «x=1», хотя, казалось бы, переменная проверена на чётность.

Способы решения


Самый простой способ решения, пригодный для нашего простого примера — копирование переменной x в локальную переменную. Вот исправленный код:

Поток 2: while (!stop) { int cached_x = x; if (cached_x%2 == 0) System.out.println("x=" + cached_x); ... }

Более сложный, но и более универсальный метод решения — синхронизация потоков, а именно:

volatile int x;

Поток 1: while (!stop) { synchronized(SomeObject) { x++; } ... }

Поток 2: while (!stop) { synchronized(SomeObject) { if (x%2 == 0) System.out.println("x=" + x); } ... }

Случай с Therac-25


Аппарат лучевой терапии Therac-25 был первым в США медицинским аппаратом, в котором вопросы безопасности были возложены исключительно на программное обеспечение. Этот аппарат работал в трёх режимах:

  1. Электронная терапия: электронная пушка напрямую облучает пациента; компьютер задаёт энергию электронов от 5 до 25 МэВ.
  2. Рентгеновская терапия: электронная пушка облучает вольфрамовую мишень, и пациент облучается рентгеновскими лучами, проходящими через конусообразный рассеиватель. В этом режиме энергия электронов одна: 25 МэВ.
  3. В третьем режиме никакого излучения не было. На пути электронов (на случай аварии) располагается стальной отражатель, а излучение имитируется светом. Этот режим применяется для того, чтобы точно навести пучок на больное место.

Эти три режима задавались вращающимся диском, в котором было отверстие с отклоняющими магнитами для электронной терапии, и мишень с рассеивателем для рентгеновской. Из-за состояния гонки между управляющей программой и обработчиком клавиатуры иногда случалось, что в режиме рентгеновской терапии диск оказывался в положении «Электронная терапия», и пациент напрямую облучался пучком электронов в 25 МэВ, что вело к переоблучению. При этом датчики выводили «Нулевая доза», поэтому оператор мог повторить процедуру, усугубляя ситуацию.

Часть кода была взята из Therac-6 и Therac-20. При этом в Therac-6 не было электронной терапии, а в Therac-20 были аппаратные меры безопасности, которые не давали включить излучение, когда диск в неправильном положении.

См. также


Ошибки программирования | Параллельные вычисления

Wettlaufsituation | Race hazard | Condición de carrera | Lenktynių aplinka | Hazard (elektronika) | 競爭危害

 

This article is licensed under the GNU Free Documentation License. It uses material from the "Состояние гонки".

Home Pageartsbusinesscomputersgameshealthhospitalshomekids & teensnewsphysiciansrecreationreferenceregionalscienceshoppingsocietysportsworld