Что такое поток (thread) в программировании?

«Что такое поток (thread) в программировании?» — вопрос из категории Многопоточность, который задают на 25% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Поток (thread) — это наименьшая единица выполнения, которую может планировать операционная система. В рамках одного процесса может выполняться множество потоков, которые разделяют его ресурсы: память (кучу), открытые файлы, переменные среды.

Ключевые характеристики:

  • Лёгковесность: Создание и переключение контекста между потоками одного процесса дешевле, чем между процессами, так как у них общее адресное пространство.
  • Параллелизм: Потоки позволяют выполнять несколько задач «одновременно» (на многопроцессорных/многоядерных системах) или создавать иллюзию одновременности за счёт быстрого переключения (на одноядерных).
  • Разделяемая память: Это главное преимущество и главная проблема. Все потоки процесса имеют прямой доступ к его глобальным данным, что требует механизмов синхронизации для избежания состояний гонки (race conditions).

Базовый пример создания потока в C# (используя Thread):

using System;
using System.Threading;

class Program
{
    static void Main()
    {
        // Создание нового потока. В конструктор передаётся делегат (метод для выполнения).
        Thread workerThread = new Thread(() =>
        {
            // Этот код выполняется в фоновом потоке.
            Console.WriteLine($"Работает поток с ID: {Thread.CurrentThread.ManagedThreadId}");
            Thread.Sleep(1000); // Имитация работы
            Console.WriteLine("Поток завершил работу.");
        });

        workerThread.Start(); // Запуск потока. Управление возвращается немедленно.
        Console.WriteLine("Основной поток продолжает работу.");

        workerThread.Join(); // Основной поток блокируется, ожидая завершения workerThread.
        Console.WriteLine("Основной поток завершён после workerThread.");
    }
}

Современные альтернативы в .NET:

  • Task и async/await: Рекомендуемая абстракция для асинхронных и параллельных операций. Task эффективнее управляет пулом потоков, чем прямое создание Thread.
  • ThreadPool: Пул готовых потоков для выполнения коротких задач, минимизирующий накладные расходы на создание.

Основные проблемы многопоточности: гонки данных, взаимные блокировки (deadlocks), инверсия приоритетов. Для их решения используются примитивы синхронизации: lock, Monitor, Mutex, Semaphore, а также потокобезопасные коллекции из пространства имён System.Collections.Concurrent.