Ответ
Поток (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.