Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.90/40: Рейтинг темы: голосов - 40, средняя оценка - 4.90
36 / 25 / 12
Регистрация: 08.04.2013
Сообщений: 269

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

20.09.2016, 16:43. Показов 7836. Ответов 20
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день!
Есть известный int N=10000, необходимо создать несколько потоков с циклами

C#
1
2
3
4
(for int x=0; x<N;x++)
{
//какой-то код
}
как сделать так, чтобы этот цикл выполнялся в несколько потоков, например в 11?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
20.09.2016, 16:43
Ответы с готовыми решениями:

Как выполнить цикл в несколько потоков с использованием Task?
Необходимо что бы в цикле for создавались потоки, которые выполняют функции, а все игнорируется... что же делать? private void...

Цикл в несколько потоков для работы с множеством страниц HTML
Есть цикл в нем самая долгоиграющая задача выполнение функции GetContentCurentPage, суть сводится к тому что-бы загрузить HTML страницу и...

Не выполняется бесконечный цикл в несколько потоков
using System; namespace BCL_AC_ { class Program { public static void Main(string args) { for (int i = 0; i &lt;...

20
 Аватар для EveKS
601 / 485 / 185
Регистрация: 19.04.2016
Сообщений: 1,885
20.09.2016, 23:33
Студворк — интернет-сервис помощи студентам
afront,
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
        #region Task_Parallel_Loop
        static async Task<double[,]> MultiplyMatricesTaskParallel
            (double[,] matA, double[,] matB, double[,] result)
        => await 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++)
                {
                    double temp = 0;
                    for (int k = 0; k < matACols; k++)
                    {
                        temp += matA[i, k] * matB[k, j];
                    }
                    result[i, j] = temp;
                }
            }); // Parallel.For
            return result;
        });
        #endregion
C#
1
2
3
4
5
6
Executing sequential loop...
Sequential loop time in milliseconds: 2051
Executing parallel loop...
Parallel loop time in milliseconds: 389
Executing parallel loop...
TaskParallel loop time in milliseconds: 346
Весь код
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
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 Task_Parallel_Loop
        static async Task<double[,]> MultiplyMatricesTaskParallel
            (double[,] matA, double[,] matB, double[,] result)
        => await 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++)
                {
                    double temp = 0;
                    for (int k = 0; k < matACols; k++)
                    {
                        temp += matA[i, k] * matB[k, j];
                    }
                    result[i, j] = temp;
                }
            }); // Parallel.For
            return result;
        });
        #endregion
 
        #region Parallel_Loop
        static double[,] MultiplyMatricesParallel(double[,] matA, double[,] matB, double[,] result)
        {
            int matACols = matA.GetLength(1);
            int matBCols = matB.GetLength(1);
            int matARows = matA.GetLength(0);
 
            // A basic matrix multiplication.
            // Parallelize the outer loop to partition the source array by rows.
            Parallel.For(0, 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;
                }
            }); // Parallel.For
            return result;
        }
        #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();
            var a = MultiplyMatricesParallel(m1, m2, result);
            stopwatch.Stop();
            Console.Error.WriteLine("Parallel loop time in milliseconds: {0}",
                                    stopwatch.ElapsedMilliseconds);
 
            stopwatch.Reset();
            result = new double[rowCount, colCount2];
 
            // Do the parallel loop.
            Console.Error.WriteLine("Executing parallel loop...");
            stopwatch.Start();
            var b = MultiplyMatricesTaskParallel(m1, m2, result).GetAwaiter().GetResult();
            stopwatch.Stop();
            Console.Error.WriteLine("TaskParallel loop time in milliseconds: {0}",
                                    stopwatch.ElapsedMilliseconds);
            Console.ReadKey();
        }
        #endregion
    }
}

Немного, но быстрее.

Добавлено через 1 минуту
ну или:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#region Task_Parallel_Loop
        static async Task<double[,]> MultiplyMatricesTaskParallel
            (double[,] matA, double[,] matB, double[,] result)
        {
         await 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++)
                {
                    double temp = 0;
                    for (int k = 0; k < matACols; k++)
                    {
                        temp += matA[i, k] * matB[k, j];
                    }
                    result[i, j] = temp;
                }
            }); // Parallel.For
            return result;
        }
}
        #endregion
Добавлено через 3 минуты
Console.WriteLine(a.Equals(b)); false

Добавлено через 35 минут
afront, т.к. даже:
C#
1
Console.WriteLine(a.Cast<double>().OrderBy(n=>n).Equals(a.Cast<double>().OrderBy(n => n)));
Выдает false
"Посмотрел с другой стороны"
C#
1
Console.WriteLine(string.Join(" ", a.Cast<double>().Except(b.Cast<double>())));
Не чего не выводит. Значит всё правильно
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
20.09.2016, 23:33

Функция в несколько потоков
Здравствуйте! У меня есть функция. Но как бы я ее не оптимизировал скорости прибавления не много. Хотелось бы чтобы эта функция...

Несколько асинхронных потоков
Здравствуйте. listener.BeginAcceptTcpClient( new AsyncCallback(ListnerPort), ...

Прервать несколько потоков
Доброго времени суток уважаемые! Подскажите пожалуйста, как правильно решить следующую задачу: выполнить некоторый метод в разных, не...

Несколько потоков работают с ошибкой
Всем привет. Бьюсь над мультипоточностью уже вторые сутки. Заранее прошу меня извинить, описать проблему без приведения своего...

Скачать файл в несколько потоков
Подскажите, пожалуйста, где ошибся в своих размышлениях насчет многопоточного скачивания: 1) получаем размер файла, разбиваем его на...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
21
Ответ Создать тему
Новые блоги и статьи
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru