Умножение матриц с использоанием многопоточного программирования - C#
Формулировка задачи:
Нужно переделать однопоточное в многопоточное
Листинг программы
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- namespace ConsoleApplication1
- {
- class Program
- {
- static void Main(string[] args)
- {
- int[,] m1 = new int[10, 10]; //объяление матрицы 1
- int[,] m2 = new int[10, 10];//объяление матрицы 2
- int[,] m3 = new int[10, 10]; //объяление произведения матрицы
- Random ran = new Random(); // Заполнение случайными числами
- for (int m = 0; m < 10; m++)
- {
- for (int je = 0; je < 10; je++)
- {
- m1[m, je] = ran.Next(30); // ran.Next(функция задает максимально допустимое значение);
- m2[m, je] = ran.Next(30);
- }
- }
- for (int m = 0; m < 10; m++)
- {
- for (int je = 0; je < 10; je++)
- {
- m3[m, je] = m1[m, je] * m2[m, je]; // Произведение матриц
- }
- }
- {
- Console.ForegroundColor = ConsoleColor.Green;
- Console.WriteLine("Матриц m1 и m2:");
- for (int i = 0; i < 10; i++)
- {
- for (int j = 0; j < 10; j++)
- {
- Console.Write(m1[i, j].ToString("000") + " "); // вывод в консоль м1
- }
- Console.WriteLine();
- }
- }
- Console.WriteLine("Матриц m2:");
- for (int i = 0; i < 10; i++)
- {
- for (int j = 0; j < 10; j++)
- {
- Console.Write(m2[i, j].ToString("000") + " "); // вывод в консоль м2
- }
- Console.WriteLine();
- }
- Console.WriteLine("Произведение двумерных матриц m1 и m2:");
- for (int i = 0; i < 10; i++)
- {
- for (int j = 0; j < 10; j++)
- {
- Console.Write(m3[i, j].ToString("000") + " "); // вывод в консоль *
- }
- Console.WriteLine();
- }
- Console.ReadKey();
- }
- }
- }
Решение задачи: «Умножение матриц с использоанием многопоточного программирования»
textual
Листинг программы
- using System;
- using System.Threading;
- using System.Threading.Tasks;
- using System.Diagnostics;
- namespace ThreadKR
- {
- class MainClass
- {
- //Объект для блокировки
- private static object LockThis = new System.Object ();
- //Количество потоков
- public const int ThreadCount = 10;
- //Сумма (разделяемое между потоками поле)
- public static double Sum = 0;
- //Произведение (разделяемое между потоками поле)
- public static double Prod = 1;
- //Левая граница
- public const double LeftBound = 1;
- //Правая граница
- public const double RightBound = 20;
- //Приращение
- public const double DeltaX = 0.2;
- //Параметр a
- public const double a = 1;
- //Параметр b
- public const double b = 2;
- //Параметр c
- public const double c = 3;
- //Общее количество итераций
- public static int IterationCount;
- //Максимальное количество итераций на 1 поток
- public static double ThreadIterationCount;
- // Функция потока f(x)=a*x^2 + b*x + c
- static void Function(object Params)
- {
- //Получение параметров
- //Левая граница куска
- double LocalLeftBound = Convert.ToDouble ((Params as object[]) [0]);
- //Правая граница куска
- double LocalRightBound = Convert.ToDouble ((Params as object[]) [1]);
- //Приращение
- double LocalDeltaX = Convert.ToDouble ((Params as object[]) [2]);
- //Имитация задержки
- Thread.Sleep (Convert.ToInt32 (Math.Round ((new Random ()).NextDouble () * 1000)));
- for (double i = LocalLeftBound; i<LocalRightBound; i+=LocalDeltaX) {
- //Блок доступа к разделяемому ресурсу
- lock (LockThis) {
- //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- // Вычисление f(i)=a*i^2 + b*i + c суммы и произведения
- //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- Sum = Sum + (a * i * i + b * i + c);
- Prod = Prod * (a * i * i + b * i + c);
- }
- }
- Console.WriteLine ("Вызов потока {0}",Convert.ToString((Params as object[])[3]));
- }
- public static void Main (string[] args)
- {
- Stopwatch sw = new Stopwatch ();
- Console.WriteLine ("Исходные данные\n" +
- "Функция f(x)=a*x^2 + b*x + c");
- Console.WriteLine (
- "Левая граница перебора: {0}\n" +
- "Правая граница перебора: {1}\n" +
- "Приращение: {2}\n"+
- "Количество потоков: {3}",
- LeftBound,RightBound,DeltaX,ThreadCount);
- IterationCount = Convert.ToInt32((RightBound - LeftBound) / DeltaX);
- ThreadIterationCount = Convert.ToInt32(IterationCount / ThreadCount);
- Console.WriteLine (
- "Общее количество итераций: {0}\n" +
- "Максимальное количество итераций на 1 поток: {1}",
- IterationCount,ThreadIterationCount
- );
- sw.Start ();
- // Создаем ссылки на потоки
- Thread[] thr=new Thread[ThreadCount];
- double p1, p2;
- // Создаем и запускаем потоки
- for (int i=0; i<ThreadCount; i++)
- {
- p1 = LeftBound + i * ThreadIterationCount * DeltaX;
- p2 = LeftBound + (i+1) * ThreadIterationCount * DeltaX;
- Console.WriteLine (
- "Локальная левая граница: {0}\n"+
- "Локальная правая граница: {1}\n"+
- "Приращение: {2}\n",
- p1,p2,DeltaX
- );
- thr [i] = new Thread (Function);
- thr [i].Start (new object[] {p1,p2,DeltaX,thr[i].ManagedThreadId});
- }
- for (int i=0; i<ThreadCount; i++)
- thr [i].Join ();
- sw.Stop ();
- Console.WriteLine (
- "Результаты расчетов:\n"+
- "Сумма: {0}\n" +
- "Произведение: {1}\n"+
- "Затраченное время (милисек): {2}",
- Sum,Prod,sw.ElapsedMilliseconds
- );
- }
- }
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д