Что такое состояние гонки?

 $json = '{ "a1":{ "field1":"name1", "field2":age1, "field3":"country1"
 }, 

 "a2":{ "field1":"name2", "field2":age2, "field3":"country2" },

  "a3":{ "field1":"name3", "field2":age3, "field3":"country3" } }';

  $Array = json_decode($json, true);

  foreach ($Array as $key => $value) 

  {

       echo " $key ";
       foreach ($value as $k => $val)   
      {
            echo "$k | $val <br />";
       }    
 }
863
задан TylerH 21 June 2016 в 20:02
поделиться

6 ответов

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

проблемы часто происходят, когда один поток делает "check-then-act" (например, "проверьте", ли значение X, то "действуйте", чтобы сделать что-то, что зависит от значения, являющегося X), и другой поток делает что-то к значению, промежуточному "проверка" и "действие". Например:

if (x == 5) // The "Check"
{
   y = x * 2; // The "Act"

   // If another thread changed x in between "if (x == 5)" and "y = x * 2" above,
   // y will not be equal to 10.
}

точка быть, y мог быть 10, или это могло быть что-либо, в зависимости от ли другой поток измененный x, промежуточный проверка и действие. У Вас нет реального способа знать.

, Чтобы препятствовать тому, чтобы условия состязания произошли, Вы обычно помещали бы блокировку вокруг совместно используемых данных, чтобы гарантировать, что только один поток может получить доступ к данным за один раз. Это означало бы что-то вроде этого:

// Obtain lock for x
if (x == 5)
{
   y = x * 2; // Now, nothing can change x until the lock is released. 
              // Therefore y = 10
}
// release lock for x
1097
ответ дан Amit Joki 21 June 2016 в 20:02
поделиться

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

12
ответ дан Jorge Córdoba 21 June 2016 в 20:02
поделиться

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

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

, условия состязания Обнаружения могут быть трудными, но существует пара знаков. Код, который полагается в большой степени на сны, подвержен условиям состязания, поэтому первой проверке на вызовы для сна в затронутом коде. Добавление особенно длинных снов может также использоваться для отладки, чтобы попытаться вызвать особый порядок событий. Это может быть полезно для репродуцирования поведения, видя, можно ли заставить его исчезнуть путем изменения синхронизации вещей, и для тестирования решений, помещенных на месте. Сны должны быть удалены после отладки.

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

18
ответ дан tsellon 21 June 2016 в 20:02
поделиться

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

Пример: Предположите, что у Вас есть два потока, A и B.

В Потоке A:

if( object.a != 0 )
    object.avg = total / object.a

В Потоке B:

object.a = 0

, Если поток A вытесняется сразу после наличия проверки, что object.a не является пустым, B сделает a = 0, и когда поток A получит процессор, это сделает, "делятся на нуль".

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

31
ответ дан Blorgbeard 21 June 2016 в 20:02
поделиться

Своего рода определение" , когда два потока получают доступ к тому же местоположению в памяти одновременно, и по крайней мере один из доступов является записью ". В ситуации поток "читателя" может получить старое значение или новое значение, в зависимости от которого поток "выигрывает гонки". Это - не всегда bug— на самом деле некоторые действительно волосатые алгоритмы низкого уровня делают это на purpose— но этого нужно обычно избегать. Gury give's @Steve хороший пример того, когда это могла бы быть проблема.

33
ответ дан Chris Conway 21 June 2016 в 20:02
поделиться

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

Берут этот пример:

for ( int i = 0; i < 10000000; i++ )
{
   x = x + 1; 
}

, Если бы у Вас было 5 потоков, выполняющих этот код сразу, значение x НЕ закончило бы тем, что было 50,000,000. Это на самом деле менялось бы в зависимости от каждого выполнения.

Это вызвано тем, что, для каждого потока для постепенного увеличения значения x они должны сделать следующее: (упрощенный, очевидно)

Retrieve the value of x
Add 1 to this value
Store this value to x

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

Скажем, поток получает значение x, но еще не сохранил его. Другой поток может также получить тот же значение x (потому что никакой поток еще не изменил его), и затем они оба сохранили бы тот же значение (x+1) назад в x!

Пример:

Thread 1: reads x, value is 7
Thread 1: add 1 to x, value is now 8
Thread 2: reads x, value is 7
Thread 1: stores 8 in x
Thread 2: adds 1 to x, value is now 8
Thread 2: stores 8 in x

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

for ( int i = 0; i < 10000000; i++ )
{
   //lock x
   x = x + 1; 
   //unlock x
}

Здесь, ответ выходит как 50 000 000 каждых раз.

Для больше на блокировке, ищите: взаимное исключение, семафор, критический раздел, совместно используемый ресурс.

199
ответ дан IKavanagh 21 June 2016 в 20:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: