Гонка данных в C#
Гонка возникает, когда несколько потоков читают и пишут одно поле без координации. Операция count++ не атомарна: поток читает число, прибавляет единицу и записывает обратно. Между этими шагами второй поток может прочитать то же старое число и записать его, затерев чужое прибавление.
Итог недетерминирован: на большом числе итераций счётчик почти всегда меньше, чем число потоков, умноженное на число шагов. Теоретически возможен и удачный прогон, но это не делает код корректным.
Восемь потоков без согласования увеличивают общий счётчик по 50_000 раз каждый. Вторая строка чаще False: count реже равен 400_000:
int count = 0;
const int threads = 8;
const int perThread = 50_000;
Thread[] workers = new Thread[threads];
for (int i = 0; i < threads; i++)
{
workers[i] = new Thread(() =>
{
for (int j = 0; j < perThread; j++) count++;
});
workers[i].Start();
}
foreach (Thread t in workers) t.Join();
Console.WriteLine(count);
Console.WriteLine(count == threads * perThread);
Запустите три потока. В каждом 200 раз прибавьте 2 к общему счёту очков. Дождитесь всех и выведите счёт вместе с проверкой, равен ли он 1200.