Потоки и поиск в матрице - C#
Формулировка задачи:
Доброго времени суток!
Стоит такая задача: вывести наибольшее число в каждой строке матрицы m*n. Проверку выполнять с помощью 2-3 потоков.
Вот код моей программы:
Доп. класс:
Проблема вот в чем: программа выводит всё хорошо и без ошибок, но в конце бросает IndexOutOfRangeException (строку пометил в коде доп. класса) или же просто останавливается (т.е. выводится вся нужная информация или часть, а надпись "Для продолжения нажмите любую клавишу..." не выводится и консоль просто ждет чего-то).
Подскажите, пожалуйста, как это можно исправить?
P.S. использовал 3 потока и семафор, может с ним что-то накосячил?
Листинг программы
- static void Main(string[] args)
- {
- Console.WriteLine("Введите размерность матрицы:");
- Console.Write("Столбцы: ");
- int cols = Int32.Parse(Console.ReadLine());
- Console.Write("Ряды: ");
- int rows = Int32.Parse(Console.ReadLine());
- MSystem ms = new MSystem(cols, rows);
- Console.WriteLine("Сгенерированная матрица:");
- ms.ShowMatr();
- Console.WriteLine("Большее число каждой строки:");
- ms.ShowBiggestValues();
- }
Листинг программы
- using System.Threading;
- class MSystem
- {
- private int cols, rows;
- private int[,] matr;
- private static Semaphore _pool;
- private bool[] check;
- public MSystem(int _cols, int _rows)
- {
- cols = _cols;
- rows = _rows;
- matr = new int [rows,cols];
- check = new bool[rows];
- _pool = new Semaphore(0, 3);
- FillMatr();
- }
- public void ShowMatr()
- {
- for (int i = 0; i < rows; i++)
- {
- for (int j = 0; j < cols; j++)
- Console.Write("{0} ", matr[i, j]);
- Console.WriteLine();
- }
- }
- private void FillMatr()
- {
- Random rd = new Random();
- for (int i = 0; i < rows; i++)
- for (int j = 0; j < cols; j++)
- matr[i, j] = rd.Next(0, 55);
- Console.WriteLine("Автозаполнение выполнено.");
- Thread.Sleep(500);
- }
- public void ShowBiggestValues()
- {
- for (int i = 0; i < 3; i++)
- {
- Thread tr = new Thread(new ParameterizedThreadStart(Count));
- tr.Start(i+1);
- }
- _pool.Release(3);
- }
- private void Count(object number)
- {
- int result = 0;
- int index = -1;
- int max = -1;
- while (result != -1)
- {
- // плучения индекса ещё не проверенной строки
- for (int i = 0; i < rows; i++)
- {
- if (!check[i])
- {
- index = i;
- max = matr[i,0];
- check[i] = true;
- break;
- }
- else
- index = -1;
- }
- if (result != -1)
- {
- // работа со строкой (если есть)
- for (int j = 0; j < cols; j++)
- if (matr[index, j] > max) // ВОТ ТУТ БРОСАЕТ IndexOutOfRangeException
- max = matr[index, j];
- // вывод результата
- Console.WriteLine("Поток {0}: больший элемент в строке {1} - {2}", number, index+1, max);
- // задержка
- Thread.Sleep(1000);
- }
- _pool.WaitOne();
- }
- Console.WriteLine("Поток {0} закончил работу.", number);
- }
- }
разобрался, спасибо)
Решение задачи: «Потоки и поиск в матрице»
textual
Листинг программы
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Threading.Tasks;
- class Program
- {
- static void Main(string[] args)
- {
- int[,] arr =
- {
- { 1,2,3,4,5},
- {2,3,6,7,8 },
- {10,20,3,4,5 },
- { 1,2,3,4,5},
- {2,3,6,7,8 },
- {10,20,3,4,5 },
- };
- Func<int[,], Task<IEnumerable<IEnumerable<int>>>> ToTaskEnum
- = async array
- => await Task.Run(()
- =>
- {
- return arr.ToEnumerable();
- });
- Func<Task<IEnumerable<IEnumerable<int>>>, Task<IEnumerable<int>>> GetMax
- = async toTaskEnum
- => await Task.Run(async ()
- =>
- {
- var result = await toTaskEnum;
- return result.Select(col => col.Max());
- });
- Action<Task<IEnumerable<int>>> WriteResult
- = async _result
- => await Task.Run(async ()
- =>
- {
- var result = await _result;
- Console.WriteLine(string.Join(" ", result));
- });
- WriteResult(GetMax(ToTaskEnum(arr)));
- Console.ReadKey(false);
- }
- }
- public static class ToEnum
- {
- public static IEnumerable<IEnumerable<int>> ToEnumerable(this int[,] arr)
- {
- for (int i = 0; i < arr.GetLength(0); i++)
- {
- var list = new List<int>();
- for (int j = 0; j < arr.GetLength(1); j++)
- list.Add(arr[i, j]);
- yield return list;
- }
- }
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д