Выбор ответа Junior Потоки и синхронизация спрашивают часто обновлено
Гонка на count++
Вопрос
Два потока по 1 000 000 раз выполняют count++ для общей переменной int count. Что будет в конце?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Скорее всего меньше 2 000 000: часть инкрементов потеряется. count++ состоит из трёх шагов: прочитать, прибавить, записать.
Варианты ответа
- Ровно 2 000 000: операция
++надintатомарна в .NET - Всегда ровно 1 000 000: потоки перезаписывают друг друга целиком
- Скорее всего меньше 2 000 000: часть инкрементов потеряетсяправильный ответ
- Будет исключение
InvalidOperationExceptionиз-за гонки потоков
Разбор
count++ состоит из трёх шагов: прочитать, прибавить, записать. Если два потока прочитали одно и то же значение, один инкремент потеряется. Атомарны только чтение и запись int по отдельности, а не их сочетание. Результат непредсказуем, но обычно меньше ожидаемого. Исключения среда не бросает. Решение: Interlocked.Increment(ref count) или lock.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.