Многопоточная обработка структур - C#
Формулировка задачи:
Прошу сильно не ругать. Нужна помощь со студенческим заданием. Задание такое:
Собственно, сам вариант задания:
Есть идеи вообще как его выполнять? Не начинал даже, т.к. не понимаю с чего, поэтому какого-либо кода нет.
В методичке к предмету описан только запуск потоков на шарпе в консоль и всё. С шарпом знаком, но недостаточно хорошо.
В работе необходимо реализовать многопоточную обработку
массива структур данных (из N элементов) четырьмя способами:
1. При помощи массива из M потоков (M ≤ N), используя
для синхронизации объект ядра — семафор.
2. При помощи массива из M потоков (M ≤ N), используя
для синхронизации сеть Петри, моделирующую семафор.
3. При помощи пула из M потоков (M ≤ N), используя сис-
темный пул потоков или асинхронные потоки ввода/вывода.
4. При помощи пула из M потоков (M ≤ N), моделируя его
при помощи сети Петри.
При обработке массива данных массивом потоков каждый
поток либо заранее выбирает диапазон элементов массива дан-
ных, которые он будет обрабатывать, либо просто берет первый
необработанный элемент. Завершив обработку одного элемента,
поток переходит к обработке следующего.
При обработке массива данных пулом потоков, завершив
обработку одного элемента массива данных, освободившийся в
пуле поток переходит к обработке следующего необработанного
элемента.
Чтобы не требовалось создавать слишком большие массивы
(для которых эффект от параллельной обработки будет наиболее
очевидным), можно имитировать ситуацию, когда обработка од-
ного элемента массива требует больше процессорного времени,
чем в действительности. Для этого после обработки очередного
элемента массива поток может делать паузу на указанное количе-
ство миллисекунд.
Входной файл должен иметь имя «input.txt» или «input.xml».
Выходной файл должен иметь имя «output.txt».
Поле Значение |
PA Выбранный способ обработки массива |
N Размер массива структур данных (значения полей каждой |
структуры генерируются программой случайным образом) |
M Количество параллельных потоков (если 0, то принимается |
равным числу процессорных ядер в системе) |
PT Пауза после обработки каждого элемента массива (мс) |
… Дополнительные входные данные (зависят от варианта) |
Поле Значение |
T1 Время, требующееся на линейную обработку массива (без |
распараллеливания вычислений) |
TP Время, требующееся на параллельную обработку массива |
выбранным способом |
… Результаты обработки (зависят от варианта) |
Структура описывает кость домино (количе-
ство точек — две цифры в диапазоне от 1 до 6, а также ориента-
ция кости). Требуется определить — образует ли последователь-
ность костей домино правильную последовательность. Если да —
вывести в выходной файл всю последовательность. Если нет —
вывести номера костей, нарушающих последовательность.
Решение задачи: «Многопоточная обработка структур»
textual
Листинг программы
using System; using System.Threading; namespace ConsoleApplication37 { class Program { static void Main() { int[,] a = {{1, 2, 3}, {4, 5, 6}, {6, 7, 8}}; int[] maxs = GetMaxs(a); foreach (int i in maxs) { Console.WriteLine(i); } } private static int[] GetMaxs(int[,] a) { int completed = 0; var ev = new ManualResetEvent(false); var result = new int[a.GetLength(0)]; for (int i = 0; i < result.Length; i++) { int index = i; ThreadPool.QueueUserWorkItem(state => { result[index] = CalculateRow(a, index); if (Interlocked.Increment(ref completed) == result.Length) ev.Set(); }); } ev.WaitOne(); return result; } private static int CalculateRow(int[,] a, int i) { int max = a[i, 0]; for (int j = 1; j < a.GetLength(1); j++) { if (a[i, j] > max) max = a[i, j]; } return max; } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д