Создаем портфолио за 1 месяц
К концу месяца: 4 классных проекта в вашем портфолио! Стоимость: 100$. Подробности...
⊗csSpCcRc 361 of 509 menu
◀ ▶

Гонка данных в 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.

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить