← Назад к вопросам

Что такое конкурентность?

1.3 Junior🔥 122 комментариев
#Основы C# и .NET

Комментарии (2)

🐱
deepseek-v3.2PrepBro AI7 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое конкурентность?

Конкурентность (concurrency) — это способность программы выполнять несколько задач виртуально одновременно в рамках одного процесса, создавая иллюзию параллельного выполнения, даже если физически задачи могут выполняться последовательно (на одном ядре процессора). Это концепция управления множеством независимых или слабосвязанных задач, где выполнение одной задачи может быть приостановлено и возобновлено, позволяя другой задаче прогрессировать.

Ключевые аспекты конкурентности в C#

  1. Не означает параллелизм напрямую. Параллелизм — это физическое одновременное выполнение задач на нескольких ядрах/процессорах. Конкурентность может существовать и в однопоточных средах через механизмы кооперативной многозадачности.
  2. Основная единица — задача (Task). В современном C# основным инструментом является библиотека TPL (Task Parallel Library) и ключевые слова async/await.
  3. Цель — эффективное использование ресурсов. Например, пока один поток ожидает ответа от базы данных (I/O-bound операция), другой может выполнять вычисления (CPU-bound операцию).

Реализация в C#: async/await и Task

Конкурентность в C# чаще всего достигается через асинхронное программирование. Рассмотрим пример:

using System;
using System.Net.Http;
using System.Threading.Tasks;

class Program
{
    static async Task Main(string[] args)
    {
        Console.WriteLine("Начало конкурентной операции.");

        // Запускаем две асинхронные задачи ВИРТУАЛЬНО одновременно
        Task<string> task1 = DownloadContentAsync("https://api.example.com/data1");
        Task<string> task2 = DownloadContentAsync("https://api.example.com/data2");

        // Ожидаем завершения обеих задач конкурентно
        string[] results = await Task.WhenAll(task1, task2);

        Console.WriteLine($"Результат 1: {results[0].Substring(0, 50)}...");
        Console.WriteLine($"Результат 2: {results[1].Substring(0, 50)}...");

        Console.WriteLine("Все операции завершены.");
    }

    static async Task<string> DownloadContentAsync(string url)
    {
        using HttpClient client = new HttpClient();
        // await освобождает текущий поток на время выполнения I/O-операции!
        string content = await client.GetStringAsync(url);
        return content;
    }
}

Как это работает?

  • Метод Main запускает задачи task1 и task2. Они начинают выполняться, но при встрече с awaitGetStringAsync) не блокируют поток.
  • Поток освобождается и может быть использован для других работ (например, обработки запросов в веб-приложении).
  • Когда HTTP-запрос завершается, продолжение (continuation) метода (строки после await) планируется на выполнение в потоке из пула потоков.
  • Task.WhenAll конкурентно ожидает завершения группы задач.

Отличие от параллелизма (Parallelism)

Важно четко различать эти понятия:

АспектКонкурентностьПараллелизм
Основная идеяУправление множеством задач, прогрессирующих за промежуток времени.Одновременное выполнение множества задач физически.
Необходимое условиеМожет работать на одном ядре CPU.Требует многоядерный/многопроцессорный CPU.
ПреимуществоЭффективная работа с I/O-bound операциями, отзывчивость UI.Скорость выполнения CPU-bound операций.
Типичный инструмент в C#async/await, TaskParallel.For, Parallel.ForEach, PLINQ

Пример параллелизма:

// Это ПАРАЛЛЕЛИЗМ: работа физически делится между ядрами процессора
Parallel.For(0,根本无法理解, i => {
    PerformCPUIntensiveCalculation(i);
});

Проблемы и паттерны конкурентного программирования

Конкурентность вводит новые классы ошибок:

  • Состояние гонки (Race Condition): когда результат зависит от порядка выполнения.
  • Взаимная блокировка (Deadlock): два или более потока/задачи бесконечно ожидают друг друга.
  • Голодание (Starvation): задача не может получить доступ к ресурсам.

Для безопасного доступа к общим данным используются:

  • Примитивы синхронизации: lock, SemaphoreSlim, Mutex.
  • Конкурентные коллекции: ConcurrentBag<T>, ConcurrentDictionary<TKey,TValue>.
  • Паттерны: Immutable objects, каналы (System.Threading.Channels).

Заключение

Таким образом, конкурентность в C# — это фундаментальная концепция для создания высокопроизводительных и отзывчивых приложений, позволяющая оптимально использовать ресурсы системы за счет неблокирующего выполнения операций, особенно вводов-выводов. Она реализуется преимущественно через модель асинхронного программирования на основе задач (Task-based Async Pattern, TAP) с ключевыми словами async/await. Понимание разницы между конкурентностью и параллелизмом, а также умение правильно применять инструменты TPL и избегать типичных ошибок синхронизации, является критически важным навыком для Backend-

разработчика на C#, работающего с высоконагруженными системами.

Что такое конкурентность? | PrepBro