Пул потоками вывести номер столбца массива, в котором есть минимальный элемент текущей строки - C#
Формулировка задачи:
Мне нужно пул потоками вивести номер столпца массива в котором есть минимальный елемент текущей строки. Програма сделана по шаблону даному учителем. (Извените зо ошибки)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
namespace lab_2
{
class Program
{
static int numOfCol = 0;
static int j, i = 0;
static int min = 0;
static int number = 10;
static int[,] mas = new int[number, number];
static Random rnd = new Random();
public class EntryPoint
{
public static void TimerProc(object state)
{ }
}
public static void Main()
{
int workerThreads;
int portThreads;
for (i = 0; i < number; i++)
{
for (j = 0; j < number; j++)
{
mas[i, j] = rnd.Next(1, 100);
}
}
Console.WriteLine("processor=" + Environment.ProcessorCount);
ThreadPool.GetMaxThreads(out workerThreads, out portThreads);
Console.WriteLine("\nMaximum worker threads: \t{0}" + "\nMaximum completion port threads: {1}", workerThreads, portThreads);
//Определить нужное максимальное количество потоков
//Пусть будет по 4 на каждий процесор
//
int MaxtTreadsCount = Environment.ProcessorCount * 4;
int MaxThreadsCount = 20;
//Установим мвксимальное количество робочих потоков
ThreadPool.SetMaxThreads(MaxThreadsCount, MaxThreadsCount);
// Устаовим минимальное количество робочих потоков
ThreadPool.SetMinThreads(2, 2);
for (i = 0; i < number; i++)
{
for (j = 0; j < number; j++)
{
Console.WriteLine("i=" + i + " j=" + j + " mas=" + mas[i, j]);
}
}
Console.WriteLine("start time=" + DateTime.Now.Millisecond);
for (i = 0; i < number; i++)
{
min = mas[i, 0];
for (j = 0; j < number; j++)
{
ThreadPool.QueueUserWorkItem(Function, mas[i, j]);
//if (j == (number - 1)) { Console.WriteLine("Row" + i + "Min is in: " + numOfCol); }
}
Console.WriteLine("Row-" + i + "Min is in: " + numOfCol);
numOfCol = 0;
}
ThreadPool.GetMaxThreads(out workerThreads, out portThreads);
Console.WriteLine("\nmaximum worker threads: /t{0}" + "\nmaximum completion port threads: {1}", workerThreads, portThreads);
Console.WriteLine("end time=" + DateTime.Now.Millisecond);
Console.ReadLine();
}
public static void Function(object instance)
{
Console.WriteLine(DateTime.Now.Millisecond + " Hello of thread {0}! ", Thread.CurrentThread.GetHashCode());
int z = (int)instance;
if (z < min)
{
min = z;
numOfCol = j;
}
Thread.Sleep(1000);
}
}
}Решение задачи: «Пул потоками вывести номер столбца массива, в котором есть минимальный элемент текущей строки»
textual
Листинг программы
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Threading;
namespace ConsoleApplication1
{
class Programm
{
public static int N = 10;
public static int LimitNumberRandom=100;
public static void Main()
{
var indexRow = 0;
var rnd = new Random();
var elements = new List<int>(new int[N]);
var massiv = new List<DataElement>();
elements.ForEach(elementList =>
{
var dataElement = new DataElement(++indexRow);
elements.ForEach(element => dataElement.Elements.Add(rnd.Next(LimitNumberRandom)-rnd.Next(LimitNumberRandom)));
massiv.Add(dataElement);
});
Console.WriteLine("Massive");
massiv.ForEach(listElement =>
{
listElement.Elements.ForEach(element => Console.Write("{0,4} ", element));
Console.WriteLine();
});
Console.WriteLine();
massiv.AsParallel().ForAll(listElement =>
{
var watch = new Stopwatch();
watch.Start();
var elementIndex = 1;
var minIndex = elementIndex;
var min = listElement.Elements[0];
listElement.Elements.ForEach(element =>
{
if (min > element)
{
min = element;
minIndex = elementIndex;
}
elementIndex++;
});
watch.Stop();
Console.WriteLine("{0} ticks: Hello of thread {1}! Min[{2},{3}] = {4}", watch.ElapsedTicks, Thread.CurrentThread.ManagedThreadId, listElement.IndexRow, minIndex, min);
});
Console.ReadLine();
}
private class DataElement
{
public DataElement(int indexRow)
{
IndexRow = indexRow;
Elements = new List<int>();
}
public int IndexRow { get; set; }
public List<int> Elements { get; set; }
}
}
}