Параллелизм в C# — это выполнение нескольких задач одновременно на разных потоках или процессорах, что позволяет значительно ускорить вычисления. Он используется в задачах, требующих высокой производительности, например, в обработке больших данных или рендеринге изображений.
Виды параллелизма
Потоковый параллелизм
Потоковый параллелизм (Thread-Level Parallelism) использует несколько потоков для выполнения разных частей программы. Пример использования Task
:
using System;
using System.Threading.Tasks;
class Program
{
static async Task Main()
{
Task task1 = Task.Run(() => Console.WriteLine("Задача 1"));
Task task2 = Task.Run(() => Console.WriteLine("Задача 2"));
await Task.WhenAll(task1, task2);
}
}
Данные и параллелизм
Параллелизм данных (Data-Level Parallelism) означает, что одна и та же операция выполняется над различными частями данных. Это можно реализовать с помощью Parallel.For
:
using System;
using System.Threading.Tasks;
class Program
{
static void Main()
{
Parallel.For(0, 10, i =>
{
Console.WriteLine($"Обработка элемента {i}");
});
}
}
Инструменты для параллельного программирования
Task Parallel Library (TPL)
Библиотека TPL
предоставляет API для управления потоками через Task
и Parallel
.
Parallel LINQ (PLINQ)
PLINQ позволяет обрабатывать коллекции в параллельном режиме:
using System;
using System.Linq;
class Program
{
static void Main()
{
var numbers = Enumerable.Range(1, 10);
var squaredNumbers = numbers.AsParallel().Select(n => n * n);
foreach (var num in squaredNumbers)
{
Console.WriteLine(num);
}
}
}
Ограничения параллелизма
- Синхронизация данных: Несколько потоков могут обращаться к одной и той же памяти, что требует механизмов синхронизации (
lock
,Monitor
,Semaphore
). - Контекст выполнения: Некоторые задачи, такие как обновление UI, нельзя выполнять в фоновом потоке.
- Чрезмерное создание потоков: Избыточное количество потоков может привести к замедлению программы из-за накладных расходов на переключение контекста.
Параллелизм в C# позволяет эффективно использовать многопроцессорные системы для выполнения вычислительных задач. Использование Task
, Parallel
и PLINQ
помогает организовать параллельные вычисления, но требует внимательного управления ресурсами и синхронизации данных.