Что выведет код Junior Потоки и синхронизация обновлено
Interlocked против обычного инкремента
Вопрос
Что выведет программа (.NET 8)? По строке на каждый вывод.
int safe = 0;
Parallel.For(0, 100_000, _ => Interlocked.Increment(ref safe));
Console.WriteLine(safe);
var sum = 0L;
var locker = new object();
Parallel.For(1, 101, i => { lock (locker) sum += i; });
Console.WriteLine(sum);
Попробуйте сами
Напишите, что выведет код: каждый вывод с новой строки.
Показать ответ и разбор
Коротко
Код выведет: 100000, 5050. Interlocked.Increment атомарен, поэтому ровно 100000 увеличений.
Что выведет
100000
5050
Разбор
Interlocked.Increment атомарен, поэтому ровно 100000 увеличений. Сумма чисел от 1 до 100 под lock тоже без потерь: 5050. С обычным safe++ первое число было бы случайным и обычно меньше.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Предыдущий вопрос
Правильное использование SemaphoreSlim
Следующий вопрос
Parallel.ForEach для HTTP-запросов