/
giges
/
ParallelComputingSystems
Обзор
Документация
Войти
/
giges
/
ParallelComputingSystems
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
THREAD_THREADPOOL/task.cs
218 строк
6 KB
RukavishnikovNA
zadachi
19 дек 2025, 10:33
19 дек 2025, 10:33
b51dbc6
Код
Авторство
О чём код?
using System; using System.Collections.Generic; using System.Linq; using System.Threading; public static class ParallelHomework { public static void Main(string[] args) { ParallelHomework.ThreadMultiArrProcess(); ParallelHomework.ThreadPoolSumProcess(); ParallelHomework.ThreadMaxArrProcess(); ParallelHomework.ThreadPoolFilterMoreThenFiveProcess(); Console.ReadLine(); } // 1) Умножение массива через Thread public static void ThreadMultiArrProcess() { int[] numbers = { 1,2,3,4,5,6,7,8,9,10 }; int mid = numbers.Length / 2; Thread t1 = new Thread(() => { Console.WriteLine($"Поток {Thread.CurrentThread.ManagedThreadId}"); ProcessArrayMulti(numbers, 0, mid); }); Thread t2 = new Thread(() => { Console.WriteLine($"Поток {Thread.CurrentThread.ManagedThreadId}"); ProcessArrayMulti(numbers, mid, numbers.Length); }); t1.Start(); t2.Start(); // Дожидаемся завершения потоков (Thread.Join) t1.Join(); t2.Join(); Console.WriteLine("Result: " + string.Join(", ", numbers)); } // endIndex — НЕ включительно: [startIndex, endIndex) public static void ProcessArrayMulti(int[] array, int startIndex, int endIndex) { for (int i = startIndex; i < endIndex; i++) array[i] *= 2; } // 2) Суммирование через ThreadPool public static void ThreadPoolSumProcess() { int[] numbers = { 1,2,3,4,5,6,7,8,9,10 }; int workers = 2; int chunk = (int)Math.Ceiling(numbers.Length / (double)workers); int[] partial = new int[workers]; AutoResetEvent[] done = new AutoResetEvent[workers]; for (int w = 0; w < workers; w++) { done[w] = new AutoResetEvent(false); int start = w * chunk; int end = Math.Min(numbers.Length, start + chunk); var state = new SumState { Array = numbers, Start = start, End = end, PartialSums = partial, Index = w, Done = done[w] }; ThreadPool.QueueUserWorkItem(SumWorker, state); } // Ждём завершения всех work item (WaitHandle.WaitAll + AutoResetEvent) WaitHandle.WaitAll(done); int sum = partial.Sum(); Console.WriteLine($"Sum = {sum}"); } private static void SumWorker(object? obj) { Console.WriteLine($"Поток {Thread.CurrentThread.ManagedThreadId}"); var s = (SumState)obj!; int local = 0; for (int i = s.Start; i < s.End; i++) local += s.Array[i]; s.PartialSums[s.Index] = local; s.Done.Set(); } private sealed class SumState { public int[] Array = null!; public int Start; public int End; public int[] PartialSums = null!; public int Index; public AutoResetEvent Done = null!; } // 3) Поиск максимума через Thread public static void ThreadMaxArrProcess() { int[] numbers = { 3, 17, 5, 22, 9, 11, 8, 30, 15 }; int mid = numbers.Length / 2; int[] partialMax = new int[2]; Thread t1 = new Thread(() => { Console.WriteLine($"Поток {Thread.CurrentThread.ManagedThreadId}"); partialMax[0] = MaxRange(numbers, 0, mid); }); Thread t2 = new Thread(() => { Console.WriteLine($"Поток {Thread.CurrentThread.ManagedThreadId}"); partialMax[1] = MaxRange(numbers, mid, numbers.Length); }); t1.Start(); t2.Start(); t1.Join(); t2.Join(); int max = Math.Max(partialMax[0], partialMax[1]); Console.WriteLine($"Max = {max}"); } private static int MaxRange(int[] array, int startIndex, int endIndex) { int max = int.MinValue; for (int i = startIndex; i < endIndex; i++) if (array[i] > max) max = array[i]; return max; } // 4) Фильтрация > 5 через ThreadPool public static void ThreadPoolFilterMoreThenFiveProcess() { int[] numbers = { 1, 8, 3, 10, 5, 6, 2, 9, 7, 4 }; List<int> filteredNumbers = new List<int>(); object locker = new object(); int workers = 2; int chunk = (int)Math.Ceiling(numbers.Length / (double)workers); AutoResetEvent[] done = new AutoResetEvent[workers]; for (int w = 0; w < workers; w++) { done[w] = new AutoResetEvent(false); int start = w * chunk; int end = Math.Min(numbers.Length, start + chunk); var state = new FilterState { Array = numbers, Start = start, End = end, Result = filteredNumbers, Locker = locker, Done = done[w] }; ThreadPool.QueueUserWorkItem(FilterWorker, state); } WaitHandle.WaitAll(done); Console.WriteLine("Filtered (>5): " + string.Join(", ", filteredNumbers)); } private static void FilterWorker(object? obj) { Console.WriteLine($"Поток {Thread.CurrentThread.ManagedThreadId}"); var s = (FilterState)obj!; List<int> local = new List<int>(); for (int i = s.Start; i < s.End; i++) if (s.Array[i] > 5) local.Add(s.Array[i]); // Потокобезопасное добавление в общий List через lock (Monitor) lock (s.Locker) s.Result.AddRange(local); s.Done.Set(); } private sealed class FilterState { public int[] Array = null!; public int Start; public int End; public List<int> Result = null!; public object Locker = null!; public AutoResetEvent Done = null!; } }