Выбор ответа Junior Потоки и синхронизация спрашивают часто обновлено

Гонка на count++

Вопрос

Два потока по 1 000 000 раз выполняют count++ для общей переменной int count. Что будет в конце?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Скорее всего меньше 2 000 000: часть инкрементов потеряется. count++ состоит из трёх шагов: прочитать, прибавить, записать.

Варианты ответа

  1. Ровно 2 000 000: операция ++ над int атомарна в .NET
  2. Всегда ровно 1 000 000: потоки перезаписывают друг друга целиком
  3. Скорее всего меньше 2 000 000: часть инкрементов потеряетсяправильный ответ
  4. Будет исключение InvalidOperationException из-за гонки потоков

Разбор

count++ состоит из трёх шагов: прочитать, прибавить, записать. Если два потока прочитали одно и то же значение, один инкремент потеряется. Атомарны только чтение и запись int по отдельности, а не их сочетание. Результат непредсказуем, но обычно меньше ожидаемого. Исключения среда не бросает. Решение: Interlocked.Increment(ref count) или lock.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме