Разбить цикл на несколько потоков - C#

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

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

Добрый день! Есть известный int N=10000, необходимо создать несколько потоков с циклами
Листинг программы
  1. (for int x=0; x<N;x++)
  2. {
  3. //какой-то код
  4. }
как сделать так, чтобы этот цикл выполнялся в несколько потоков, например в 11?

Решение задачи: «Разбить цикл на несколько потоков»

textual
Листинг программы
  1. using System;
  2. using System.Threading.Tasks;
  3. using System.Diagnostics;
  4.  
  5. namespace ConsoleApplication128
  6. {
  7.     class Program
  8.     {
  9.  
  10.         #region Sequential_Loop
  11.         static void MultiplyMatricesSequential(double[,] matA, double[,] matB,
  12.                                                 double[,] result)
  13.         {
  14.             int matACols = matA.GetLength(1);
  15.             int matBCols = matB.GetLength(1);
  16.             int matARows = matA.GetLength(0);
  17.  
  18.             for (int i = 0; i < matARows; i++)
  19.             {
  20.                 for (int j = 0; j < matBCols; j++)
  21.                 {
  22.                     double temp = 0;
  23.                     for (int k = 0; k < matACols; k++)
  24.                     {
  25.                         temp += matA[i, k] * matB[k, j];
  26.                     }
  27.                     result[i, j] += temp;
  28.                 }
  29.             }
  30.         }
  31.         #endregion
  32.  
  33.         #region Parallel_Loop
  34.         static void MultiplyMatricesParallel
  35.             (double[,] matA, double[,] matB, double[,] result)
  36.         => Task.Run(()=>
  37.         {
  38.             int matACols = matA.GetLength(1);
  39.             int matBCols = matB.GetLength(1);
  40.             int matARows = matA.GetLength(0);
  41.             Parallel.For(0, matARows, i =>
  42.             {
  43.                 for (int j = 0; j < matBCols; j++)
  44.                 {
  45.                     for (int k = 0; k < matACols; k++)
  46.                         {
  47.                             result[i, j] += matA[i, k] * matB[k, j];
  48.                         }
  49.                 }
  50.             });
  51.         });
  52.         #endregion
  53.  
  54.         #region Helper_Methods
  55.  
  56.         static double[,] InitializeMatrix(int rows, int cols)
  57.         {
  58.             double[,] matrix = new double[rows, cols];
  59.  
  60.             Random r = new Random();
  61.             for (int i = 0; i < rows; i++)
  62.             {
  63.                 for (int j = 0; j < cols; j++)
  64.                 {
  65.                     matrix[i, j] = r.Next(100);
  66.                 }
  67.             }
  68.             return matrix;
  69.         }
  70.         #endregion
  71.  
  72.         #region Main
  73.         static void Main(string[] args)
  74.         {
  75.             // Set up matrices. Use small values to better view
  76.             // result matrix. Increase the counts to see greater
  77.             // speedup in the parallel loop vs. the sequential loop.
  78.             int colCount = 180;
  79.             int rowCount = 2000;
  80.             int colCount2 = 270;
  81.             double[,] m1 = InitializeMatrix(rowCount, colCount);
  82.             double[,] m2 = InitializeMatrix(colCount, colCount2);
  83.  
  84.             double[,] result = new double[rowCount, colCount2];
  85.  
  86.  
  87.             // First do the sequential version.
  88.             Console.Error.WriteLine("Executing sequential loop...");
  89.             Stopwatch stopwatch = new Stopwatch();
  90.             stopwatch.Start();
  91.  
  92.             MultiplyMatricesSequential(m1, m2, result);
  93.             stopwatch.Stop();
  94.             Console.Error.WriteLine("Sequential loop time in milliseconds: {0}",
  95.                                     stopwatch.ElapsedMilliseconds);
  96.  
  97.             // For the skeptics.
  98.             //    OfferToPrint(rowCount, colCount2, result);
  99.  
  100.             // Reset timer and results matrix.
  101.             stopwatch.Reset();
  102.             result = new double[rowCount, colCount2];
  103.  
  104.             // Do the parallel loop.
  105.             Console.Error.WriteLine("Executing parallel loop...");
  106.             stopwatch.Start();
  107.             MultiplyMatricesParallel(m1, m2, result);
  108.             stopwatch.Stop();
  109.             Console.Error.WriteLine("Parallel loop time in milliseconds: {0}",
  110.                                     stopwatch.ElapsedMilliseconds);
  111.  
  112.             Console.ReadKey();
  113.         }
  114.         #endregion
  115.     }
  116. }

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


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

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

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

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

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

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