Параллельное программирование — это подход, при котором несколько задач выполняются одновременно, используя ресурсы многоядерных процессоров. Многопоточность — частный случай параллелизма, где задачи выполняются в разных потоках.
Основные цели:
Базовый класс для создания и управления потоками.
var thread = new Thread(() =>
{
Console.WriteLine("Выполняюсь в отдельном потоке!");
});
thread.Start();
Проблемы:
Пул потоков для эффективного управления ресурсами.
ThreadPool.QueueUserWorkItem(state =>
{
Console.WriteLine("Работа в потоке из пула");
});
Современный подход к асинхронным операциям.
Task.Run(() =>
{
// Долгая операция
return CalculateResult();
});
Упрощение параллельных вычислений.
Parallel.For(0, 100, i =>
{
ProcessItem(i);
});
Для асинхронного программирования без блокировки потоков.
async Task<string> DownloadDataAsync()
{
var client = new HttpClient();
return await client.GetStringAsync("https://example.com");
}
Для безопасного доступа к общим ресурсам:
lock
(Monitor)Mutex
Semaphore
ReaderWriterLockSlim
private static readonly object _lockObj = new object();
lock (_lockObj)
{
// Критическая секция
}
Task
вместо прямого создания потоковConcurrentBag
, ConcurrentQueue
)CancellationToken
для отмены операцийvar options = new ParallelOptions { MaxDegreeOfParallelism = 4 };
Parallel.ForEach(items, options, item =>
{
ProcessItem(item);
});
параллельное программирование в C# предоставляет богатый набор инструментов (Thread, Task, Parallel, async/await) для эффективного использования современных процессоров, но требует внимательного отношения к синхронизации и управлению ресурсами.