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

«Состояние гонки» возникает, когда concurrent-programming многопоточный (или иным образом multithreading параллельный) код, который concurency должен получить доступ к race-condition общему ресурсу, может сделать programming-terms это таким образом, что это concurrent приведет к неожиданным результатам.

Возьмите concurrency этот пример:

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

Если бы у вас programming-terms было 5 потоков, выполняющих concurrency этот код одновременно, значение concurrency x НЕ БЫЛО бы в конечном итоге threads равно 50 000 000. На самом concurrent-programming деле это будет меняться с threading каждым запуском.

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

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

Любой programming-terms поток может находиться на concurency любом этапе этого процесса concurrent-programming в любое время, и они могут concurrent наступать друг на друга, когда race-condition задействован общий ресурс. Состояние programming-terms x может быть изменено другим concurency потоком в течение времени nomenclature между чтением x и его обратной thread записью.

Допустим, поток получает concurrent-programming значение x, но еще не сохранил threading его. Другой поток также может concurrency получить то же значение x (поскольку concurrency ни один поток еще не изменил programming-terms его), и тогда они оба сохранят thread то же значение (x+1) обратно в multithreading 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

Состояний гонки concurency можно избежать, используя concurrent некий механизм блокировки перед кодом, который programming-terms обращается к общему ресурсу:

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

Здесь concurrent каждый раз получается 50 concurrent 000 000.

Чтобы узнать больше concurrent-programming о блокировке, выполните поиск concurrent-programming по словам: мьютекс, семафор, критическая threading секция, общий ресурс.

multithreading

concurrency

terminology

race-condition

2022-11-17T23:04:04+00:00