Умножение матриц с использоанием многопоточного программирования - C#

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

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

Нужно переделать однопоточное в многопоточное
Листинг программы
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. namespace ConsoleApplication1
  6. {
  7. class Program
  8. {
  9. static void Main(string[] args)
  10. {
  11. int[,] m1 = new int[10, 10]; //объяление матрицы 1
  12. int[,] m2 = new int[10, 10];//объяление матрицы 2
  13. int[,] m3 = new int[10, 10]; //объяление произведения матрицы
  14. Random ran = new Random(); // Заполнение случайными числами
  15. for (int m = 0; m < 10; m++)
  16. {
  17. for (int je = 0; je < 10; je++)
  18. {
  19. m1[m, je] = ran.Next(30); // ran.Next(функция задает максимально допустимое значение);
  20. m2[m, je] = ran.Next(30);
  21. }
  22. }
  23. for (int m = 0; m < 10; m++)
  24. {
  25. for (int je = 0; je < 10; je++)
  26. {
  27. m3[m, je] = m1[m, je] * m2[m, je]; // Произведение матриц
  28. }
  29. }
  30.  
  31. {
  32. Console.ForegroundColor = ConsoleColor.Green;
  33. Console.WriteLine("Матриц m1 и m2:");
  34. for (int i = 0; i < 10; i++)
  35. {
  36. for (int j = 0; j < 10; j++)
  37. {
  38. Console.Write(m1[i, j].ToString("000") + " "); // вывод в консоль м1
  39. }
  40. Console.WriteLine();
  41. }
  42. }
  43. Console.WriteLine("Матриц m2:");
  44. for (int i = 0; i < 10; i++)
  45. {
  46. for (int j = 0; j < 10; j++)
  47. {
  48. Console.Write(m2[i, j].ToString("000") + " "); // вывод в консоль м2
  49. }
  50. Console.WriteLine();
  51. }
  52. Console.WriteLine("Произведение двумерных матриц m1 и m2:");
  53. for (int i = 0; i < 10; i++)
  54. {
  55. for (int j = 0; j < 10; j++)
  56. {
  57. Console.Write(m3[i, j].ToString("000") + " "); // вывод в консоль *
  58. }
  59. Console.WriteLine();
  60. }
  61. Console.ReadKey();
  62. }
  63.  
  64. }
  65. }

Решение задачи: «Умножение матриц с использоанием многопоточного программирования»

textual
Листинг программы
  1. using                System;
  2. using                System.Threading;
  3. using                System.Threading.Tasks;
  4. using                System.Diagnostics;
  5. namespace                 ThreadKR
  6. {
  7. class                 MainClass
  8. {
  9. //Объект                 для                 блокировки
  10. private                 static                 object                 LockThis                 =                 new                 System.Object                 ();
  11. //Количество                 потоков
  12. public                 const                 int                 ThreadCount                 =                 10;
  13. //Сумма                 (разделяемое                 между                 потоками                 поле)
  14. public                 static                 double                 Sum                 =                 0;
  15. //Произведение                 (разделяемое                 между                 потоками                 поле)
  16. public                 static                 double                 Prod                 =                 1;
  17. //Левая                 граница
  18. public                 const                 double                 LeftBound                 =                 1;
  19. //Правая                 граница
  20. public                 const                 double                 RightBound                 =                 20;
  21. //Приращение
  22. public                 const                 double                 DeltaX                 =                 0.2;
  23. //Параметр                 a
  24. public                 const                 double                 a                 =                 1;
  25. //Параметр                 b
  26. public                 const                 double                 b                 =                 2;
  27. //Параметр                 c
  28. public                 const                 double                 c                 =                 3;
  29. //Общее                 количество                 итераций
  30. public                 static                 int                 IterationCount;
  31. //Максимальное                 количество                 итераций                 на                 1                 поток
  32. public                 static                 double                 ThreadIterationCount;
  33. //                 Функция                 потока                 f(x)=a*x^2                 +                 b*x                 +                 c
  34. static                 void                 Function(object                 Params)
  35. {
  36. //Получение                 параметров
  37. //Левая                 граница                 куска
  38. double                 LocalLeftBound                 =                 Convert.ToDouble                 ((Params                 as                 object[])                 [0]);
  39. //Правая                 граница                 куска
  40. double                 LocalRightBound                 =                 Convert.ToDouble                 ((Params                 as                 object[])                 [1]);
  41. //Приращение
  42. double                 LocalDeltaX                 =                 Convert.ToDouble                 ((Params                 as                 object[])                 [2]);
  43. //Имитация                 задержки
  44. Thread.Sleep                 (Convert.ToInt32                 (Math.Round                 ((new                 Random                 ()).NextDouble                 ()                 *                 1000)));
  45. for                 (double                 i                 =                 LocalLeftBound;                 i<LocalRightBound;                 i+=LocalDeltaX)                 {
  46. //Блок                 доступа                 к                 разделяемому                 ресурсу
  47. lock                 (LockThis)                 {
  48. //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  49. //                 Вычисление                 f(i)=a*i^2                 +                 b*i                 +                 c                 суммы                 и                 произведения
  50. //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  51. Sum                 =                 Sum                 +                 (a                 *                 i                 *                 i                 +                 b                 *                 i                 +                 c);
  52. Prod                 =                 Prod                 *                 (a                 *                 i                 *                 i                 +                 b                 *                 i                 +                 c);
  53. }
  54. }
  55. Console.WriteLine                 ("Вызов                 потока                 {0}",Convert.ToString((Params                 as                 object[])[3]));
  56.  
  57. }
  58. public                 static                 void                 Main                 (string[]                 args)
  59. {
  60. Stopwatch                 sw                 =                 new                 Stopwatch                 ();
  61. Console.WriteLine                 ("Исходные                 данные\n"                 +
  62. "Функция                 f(x)=a*x^2                 +                 b*x                 +                 c");
  63. Console.WriteLine                 (
  64. "Левая                 граница                 перебора:                 {0}\n"                 +
  65. "Правая                 граница                 перебора:                 {1}\n"                 +
  66. "Приращение:                 {2}\n"+
  67. "Количество                 потоков:                 {3}",
  68. LeftBound,RightBound,DeltaX,ThreadCount);
  69. IterationCount                 =                 Convert.ToInt32((RightBound                 -                 LeftBound)                 /                 DeltaX);
  70. ThreadIterationCount                 =                 Convert.ToInt32(IterationCount                 /                 ThreadCount);
  71. Console.WriteLine                 (
  72. "Общее                 количество                 итераций:                 {0}\n"                 +
  73. "Максимальное                 количество                 итераций                 на                 1                 поток:                 {1}",
  74. IterationCount,ThreadIterationCount
  75. );
  76. sw.Start                 ();
  77. //                 Создаем                 ссылки                 на                 потоки
  78. Thread[]                 thr=new                 Thread[ThreadCount];
  79. double                 p1,                 p2;
  80. //                 Создаем                 и                 запускаем                 потоки
  81. for                 (int                 i=0;                 i<ThreadCount;                 i++)
  82. {
  83. p1                 =                 LeftBound                 +                 i                 *                 ThreadIterationCount                 *                 DeltaX;
  84. p2                 =                 LeftBound                 +                 (i+1)                 *                 ThreadIterationCount                 *                 DeltaX;
  85. Console.WriteLine                 (
  86. "Локальная                 левая                 граница:                 {0}\n"+
  87. "Локальная                 правая                 граница:                 {1}\n"+
  88. "Приращение:                 {2}\n",
  89. p1,p2,DeltaX
  90. );
  91. thr                 [i]                 =                 new                 Thread                 (Function);
  92. thr                 [i].Start                 (new                 object[]                 {p1,p2,DeltaX,thr[i].ManagedThreadId});
  93. }
  94. for                 (int                 i=0;                 i<ThreadCount;                 i++)
  95. thr                 [i].Join                 ();
  96. sw.Stop                 ();
  97. Console.WriteLine                 (
  98. "Результаты                 расчетов:\n"+
  99. "Сумма:                 {0}\n"                 +
  100. "Произведение:                 {1}\n"+
  101. "Затраченное                 время                 (милисек):                 {2}",
  102. Sum,Prod,sw.ElapsedMilliseconds
  103. );
  104. }
  105. }
  106. }

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


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

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

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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут