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

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. После завершения выведите элементы через запятую.

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