Разбить цикл на несколько потоков - C#
Формулировка задачи:
Добрый день!
Есть известный int N=10000, необходимо создать несколько потоков с циклами
как сделать так, чтобы этот цикл выполнялся в несколько потоков, например в 11?
(for int x=0; x<N;x++) { //какой-то код }
Решение задачи: «Разбить цикл на несколько потоков»
textual
Листинг программы
using System; using System.Threading.Tasks; using System.Diagnostics; namespace ConsoleApplication128 { class Program { #region Sequential_Loop static void MultiplyMatricesSequential(double[,] matA, double[,] matB, double[,] result) { int matACols = matA.GetLength(1); int matBCols = matB.GetLength(1); int matARows = matA.GetLength(0); for (int i = 0; i < matARows; i++) { for (int j = 0; j < matBCols; j++) { double temp = 0; for (int k = 0; k < matACols; k++) { temp += matA[i, k] * matB[k, j]; } result[i, j] += temp; } } } #endregion #region Parallel_Loop static void MultiplyMatricesParallel (double[,] matA, double[,] matB, double[,] result) => Task.Run(()=> { int matACols = matA.GetLength(1); int matBCols = matB.GetLength(1); int matARows = matA.GetLength(0); Parallel.For(0, matARows, i => { for (int j = 0; j < matBCols; j++) { for (int k = 0; k < matACols; k++) { result[i, j] += matA[i, k] * matB[k, j]; } } }); }); #endregion #region Helper_Methods static double[,] InitializeMatrix(int rows, int cols) { double[,] matrix = new double[rows, cols]; Random r = new Random(); for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) { matrix[i, j] = r.Next(100); } } return matrix; } #endregion #region Main static void Main(string[] args) { // Set up matrices. Use small values to better view // result matrix. Increase the counts to see greater // speedup in the parallel loop vs. the sequential loop. int colCount = 180; int rowCount = 2000; int colCount2 = 270; double[,] m1 = InitializeMatrix(rowCount, colCount); double[,] m2 = InitializeMatrix(colCount, colCount2); double[,] result = new double[rowCount, colCount2]; // First do the sequential version. Console.Error.WriteLine("Executing sequential loop..."); Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); MultiplyMatricesSequential(m1, m2, result); stopwatch.Stop(); Console.Error.WriteLine("Sequential loop time in milliseconds: {0}", stopwatch.ElapsedMilliseconds); // For the skeptics. // OfferToPrint(rowCount, colCount2, result); // Reset timer and results matrix. stopwatch.Reset(); result = new double[rowCount, colCount2]; // Do the parallel loop. Console.Error.WriteLine("Executing parallel loop..."); stopwatch.Start(); MultiplyMatricesParallel(m1, m2, result); stopwatch.Stop(); Console.Error.WriteLine("Parallel loop time in milliseconds: {0}", stopwatch.ElapsedMilliseconds); Console.ReadKey(); } #endregion } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д