Что такое параллелизм в C#

Параллелизм в 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 помогает организовать параллельные вычисления, но требует внимательного управления ресурсами и синхронизации данных.