Parallel.ForEach в C#
Метод Parallel.ForEach раздаёт элементы коллекции потокам пула, и делегат может выполняться на разных ядрах сразу. Это ускоряет работу, которая занимает процессор. Запись в общую структуру без согласования по-прежнему создаёт гонку.
Порядок вызовов делегата не совпадает с порядком элементов и от запуска к запуску меняется. Если каждый элемент пишет только в свою ячейку, дополнительно защищать запись не нужно.
Удвоим элементы массива параллельно: каждый индекс пишет только свою ячейку. После завершения все элементы обновлены. Перегрузка с индексом безопасна здесь, потому что индексы разные. Запись в один общий список из делегата потребовала бы защиты:
int[] data = [1, 2, 3];
Parallel.ForEach(data, (value, state, index) => data[index] = value * 2);
Console.WriteLine(string.Join(", ", data)); // выведет 2, 4, 6
Параллельно пройдите по числам 4, 7 и 9. Запишите в отдельный массив по тем же индексам эти числа, умноженные на 3. После завершения выведите элементы через запятую.