Многопоточная обработка структур - 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;
}
}
}