Потоки и поиск в матрице - 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;
}
}
}