Многопоточная обработка структур - C#

Узнай цену своей работы

Формулировка задачи:

Прошу сильно не ругать. Нужна помощь со студенческим заданием. Задание такое:
В работе необходимо реализовать многопоточную обработку массива структур данных (из N элементов) четырьмя способами: 1. При помощи массива из M потоков (M ≤ N), используя для синхронизации объект ядра — семафор. 2. При помощи массива из M потоков (M ≤ N), используя для синхронизации сеть Петри, моделирующую семафор. 3. При помощи пула из M потоков (M ≤ N), используя сис- темный пул потоков или асинхронные потоки ввода/вывода. 4. При помощи пула из M потоков (M ≤ N), моделируя его при помощи сети Петри. При обработке массива данных массивом потоков каждый поток либо заранее выбирает диапазон элементов массива дан- ных, которые он будет обрабатывать, либо просто берет первый необработанный элемент. Завершив обработку одного элемента, поток переходит к обработке следующего. При обработке массива данных пулом потоков, завершив обработку одного элемента массива данных, освободившийся в пуле поток переходит к обработке следующего необработанного элемента. Чтобы не требовалось создавать слишком большие массивы (для которых эффект от параллельной обработки будет наиболее очевидным), можно имитировать ситуацию, когда обработка од- ного элемента массива требует больше процессорного времени, чем в действительности. Для этого после обработки очередного элемента массива поток может делать паузу на указанное количе- ство миллисекунд. Входной файл должен иметь имя «input.txt» или «input.xml».
Поле Значение
PA Выбранный способ обработки массива
N Размер массива структур данных (значения полей каждой
структуры генерируются программой случайным образом)
M Количество параллельных потоков (если 0, то принимается
равным числу процессорных ядер в системе)
PT Пауза после обработки каждого элемента массива (мс)
… Дополнительные входные данные (зависят от варианта)
Выходной файл должен иметь имя «output.txt».
Поле Значение
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;
        }
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 3.667 из 5