Состояние гонки

Состоя́ние го́нки (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 были аппаратные меры безопасности, которые не давали включить излучение, когда диск в неправильном положении.

См. также

 
Начальная страница  » 
А Б В Г Д Е Ж З И Й К Л М Н О П Р С Т У Ф Х Ц Ч Ш Щ Ы Э Ю Я
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
0 1 2 3 4 5 6 7 8 9 Home