Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
6 / 6 / 7
Регистрация: 16.05.2013
Сообщений: 351

Многопоточный проход по матрице

30.09.2016, 18:27. Показов 1473. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток!

Пишу программу, которая с помощью 3-х (к примеру) потоков берет по 3 ряда матрицы и находит в каждом большее значение. Т.е. первый поток - 1 ряд, второй - 2 ряд, третий - 3 ряд, а потом уже 1-й - 4 ряд и т.п.

Но то, что я написал (хотя мне кажется правильно) работает не корректно! Допустим 1-й поток может пройти 3 ряда наугад (1,3,5 к примеру), а потом остальные 2 потока берут по 1 ряду из оставшихся (5х5 размер матрицы).

Пожалуйста, скажите мне - что я делаю не так? Суть в том, что потоки должны брать по 1 ряду, делать подсчет (одновременно!!! я вводил семафор...) и идти дальше, проверяя есть ли ещё доступные ряды для проверки, иначе завершать работу.

Класс MSystem - тут все методы для прохода по матрице (доступность ряда проверяю с помощью массива bool с таким же индексом, как и у ряда).
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
using System.Diagnostics;
 
namespace lab_5_CSharp
{
    class MSystem
    {
        private int cols, rows;
        private int[,] matr;
        private static Semaphore _pool;
        private bool[] check;
        private double[] time_mas;
        private bool[] time_check;
 
        public MSystem(int _cols, int _rows)
        {
            cols = _cols;
            rows = _rows;
            matr = new int [rows,cols];
            check = new bool[rows];
            time_mas = new double[4];
            time_check = new bool[4];
            _pool = new Semaphore(0, 3);
            FillMatr();
        }
 
        public void ShowMatr()
        {
            for (int i = 0; i < rows; i++)
            {
                for (int j = 0; j < cols; j++)
                    Console.Write("{0}\t", matr[i, j]);
                Console.WriteLine();
            }
        }
 
        private void FillMatr()
        {
            Random rd = new Random();
 
            for (int i = 0; i < rows; i++)
                for (int j = 0; j < cols; j++)
                    matr[i, j] = rd.Next(0, 55);
 
            Console.WriteLine("Автозаполнение выполнено.");
            Thread.Sleep(500);
        }
 
        public void ShowBiggestValues()
        {
            for (int i = 0; i < 3; i++)
            {
                Thread tr = new Thread(new ParameterizedThreadStart(Count));
                tr.Start(i+1);
            }
            _pool.Release(3);
        }
 
        private void Count(object number)
        {
            // счетчик времени работы
            Stopwatch sw = new Stopwatch();
            sw.Start();
            //int result = 0;
            int index = 0;
            int max = -1;
 
            _pool.WaitOne();
            while (index != -1)
            {
                // получения индекса ещё не проверенной строки
                for (int i = 0; i < rows; i++)
                {
                    if (!check[i])
                    {
                        index = i;
                        max = matr[i,0];
                        check[i] = true;
                        break;
                    }
                    else
                        index = -1;
                }
                
                if (index != -1)
                {
                    // работа со строкой (если есть)
                    for (int j = 0; j < cols; j++)
                        max = Math.Max(matr[index, j],max);
 
                    // вывод результата
                    Console.WriteLine("Поток {0}: больший элемент в строке {1} - {2}", number, index+1, max);
 
                    // задержка
                    Thread.Sleep(1000);
                }
            }
 
            // Подсчет времени работы потока
            sw.Stop();
            Console.WriteLine("Поток {0} закончил работу. Время работы: {1}мс.", number, sw.Elapsed.TotalSeconds);
            // Занесение данных о конце работы потока и его времени выполнения в массивы проверки
            time_mas[Int32.Parse(number.ToString())] = sw.Elapsed.TotalSeconds;
            time_check[Int32.Parse(number.ToString())] = true;
            // задержка
            Thread.Sleep(500);
            // Подсчет окончательного времени работы потоков (если в массиве проверок bool все true)
            CheckTime();
        }
 
        public void PosledShowBiggestValue()
        {
            // счетчик времени работы
            Stopwatch sw = new Stopwatch();
            sw.Start();
 
            int max;
            for (int i = 0; i < rows; i++)
            {
                max = matr[i, 0];
                for (int j = 0; j < cols; j++)
                    if (matr[i, j] > max)
                        max = matr[i, j];
                Console.WriteLine("Ряд {0}: максимальный элемент - {1}.", i+1,max);
            }
 
            sw.Stop();
            Console.WriteLine("Время работы: {0}мс.", sw.Elapsed.TotalSeconds);
            time_mas[0] = sw.Elapsed.TotalSeconds;
            time_check[0] = true;
        }
 
        private void CheckTime()
        {
            if (time_check[0] && time_check[1] && time_check[2] && time_check[3])
            {
                Console.WriteLine("\n--------------------------------");
                double tr_sum = time_mas[1] + time_mas[2] + time_mas[3];
                Console.WriteLine("Время работы последовательного поиска: {0}мс.\nВремя работы параллельного поиска: {1}мс.\n", time_mas[0], tr_sum);
            }
        }
    }
}
Класс Program (писал на консоль) - тут просто вызовы методов:
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace lab_5_CSharp
{
    class Program
    {
        public delegate void Delelka();
 
        static void Main(string[] args)
        {
            Console.WriteLine("Введите размерность матрицы:");
            Console.Write("Столбцы: ");
            int cols = Int32.Parse(Console.ReadLine());
            Console.Write("Ряды: ");
            int rows = Int32.Parse(Console.ReadLine());
 
            MSystem ms = new MSystem(cols, rows);
            
            Console.WriteLine("\nСгенерированная матрица:");
            ms.ShowMatr();
 
            Console.WriteLine("\nПоследовательный просчет:");
            ms.PosledShowBiggestValue();
            Console.WriteLine("--------------------------------");
 
            Console.WriteLine("\nБольшее число каждой строки:");
            Delelka dl = new Delelka(ms.ShowBiggestValues);
            dl.Invoke();
        }
    }
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
30.09.2016, 18:27
Ответы с готовыми решениями:

Поочередный проход по матрице
Сабж: пройти поочередно сначала по всем 3, потом 2, и, наконец, 1 int path = { {1, 2, 1, 3, 1, 2, 1, 3, 1, 2},...

Многопоточный проход по матрице
Доброго времени суток! Пишу программу, которая с помощью 3-х (к примеру) потоков берет по 3 ряда матрицы и находит в каждом большее...

Многопоточный Брут
Ругается не понятно на что. unit Unit2; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,...

6
6 / 6 / 7
Регистрация: 16.05.2013
Сообщений: 351
30.09.2016, 18:28  [ТС]
Если кому будет удобнее - прикрепляю проект.
lab5 CSharp.rar
0
1498 / 1213 / 821
Регистрация: 29.02.2016
Сообщений: 3,631
01.10.2016, 10:51
как пример
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
using System;
using System.Threading.Tasks;
using System.Linq;
using System.Diagnostics;
 
namespace ConsoleApplication128
{
    class Program
    {
 
        #region Sequential_Loop
        static void MultiplyMatricesSequential(double[,] mat, double[] result)
        {
            int matCols = mat.GetLength(1);
            int matRows = mat.GetLength(0);
            for (int i = 0; i < matRows; i++)
            {
                double[] row = new double[matCols];
                for (int j = 0; j < matCols; j++)
                 row [j] = mat[i,j];
 
                result[i] = row.Max();
            }
        }
        #endregion
 
        #region Task_Parallel_Loop
        static async Task<double[]> MultiplyMatricesTaskParallel (double[,] mat, double[] result)
        => await Task.Run(() =>
        {
            int matCols = mat.GetLength(1);
            int matRows = mat.GetLength(0);
            Parallel.For(0, matRows, i =>
            {
                    double[] row = new double[matCols];
                    for (int j = 0; j < matCols; j++)
                        row[j] = mat[i, j];
 
                    result[i] = row.Max();
            });
            return result;
        });
        #endregion
 
        #region Parallel_Loop
        static  void MultiplyMatricesParallel(double[,] mat, double[] result)
        {
            int matCols = mat.GetLength(1);
            int matRows = mat.GetLength(0);
 
            Parallel.For(0, matRows, i =>
            {
                    double[] row = new double[matCols];
                    for (int j = 0; j < matCols; j++)
                        row[j] = mat[i, j];
 
                    result[i] = row.Max();
  
            }); // Parallel.For
        }
        #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 = 1800;
            int rowCount = 20000;
            double[,] m1 = InitializeMatrix(rowCount, colCount);
 
 
            double[] result = new double[rowCount];
 
 
            // First do the sequential version.
            Console.Error.WriteLine("Executing sequential loop...");
            Stopwatch stopwatch = new Stopwatch();
            stopwatch.Start();
 
            MultiplyMatricesSequential(m1,  result);
            stopwatch.Stop();
            Console.Error.WriteLine("Sequential loop time in milliseconds: {0}",
                                   stopwatch.ElapsedMilliseconds);
            
            // Reset timer and results matrix. 
            stopwatch.Reset();
            result = new double[rowCount];
 
            // Do the parallel loop.
            Console.Error.WriteLine("Executing parallel loop...");
            stopwatch.Start();
             MultiplyMatricesParallel(m1, result);
            stopwatch.Stop();
            Console.Error.WriteLine("Parallel loop time in milliseconds: {0}",
                                    stopwatch.ElapsedMilliseconds);
 
            stopwatch.Reset();
            result = new double[rowCount];
 
            // Do the parallel loop.
            Console.Error.WriteLine("Executing parallel loop...");
            stopwatch.Start();
            var b = MultiplyMatricesTaskParallel(m1, result).GetAwaiter().GetResult();
            stopwatch.Stop();
            Console.Error.WriteLine("TaskParallel loop time in milliseconds: {0}",
                                    stopwatch.ElapsedMilliseconds);
            Console.ReadKey();
        }
        #endregion
    }
}
0
6 / 6 / 7
Регистрация: 16.05.2013
Сообщений: 351
01.10.2016, 11:37  [ТС]
1>------ Построение начато: проект: ConsoleApplication128, Конфигурация: Debug Any CPU ------
1>C:\Users\о\Desktop\ConsoleApplication1 28\ConsoleApplication128\Program.cs(31,9 8,31,99): error CS1002: ожидалась ;
1>C:\Users\о\Desktop\ConsoleApplication1 28\ConsoleApplication128\Program.cs(32,9 ,32,11): error CS1519: Недопустимый токен "=>" в объявлении класса, структуры или интерфейса
1>C:\Users\о\Desktop\ConsoleApplication1 28\ConsoleApplication128\Program.cs(32,2 7,32,28): error CS1031: Ожидался тип
1>C:\Users\о\Desktop\ConsoleApplication1 28\ConsoleApplication128\Program.cs(36,2 5,36,26): error CS1519: Недопустимый токен "(" в объявлении класса, структуры или интерфейса
1>C:\Users\о\Desktop\ConsoleApplication1 28\ConsoleApplication128\Program.cs(36,3 6,36,37): error CS1519: Недопустимый токен "," в объявлении класса, структуры или интерфейса
1>C:\Users\о\Desktop\ConsoleApplication1 28\ConsoleApplication128\Program.cs(36,4 0,36,42): error CS1519: Недопустимый токен "=>" в объявлении класса, структуры или интерфейса
1>C:\Users\о\Desktop\ConsoleApplication1 28\ConsoleApplication128\Program.cs(39,2 1,39,24): error CS1519: Недопустимый токен "for" в объявлении класса, структуры или интерфейса
1>C:\Users\о\Desktop\ConsoleApplication1 28\ConsoleApplication128\Program.cs(39,4 8,39,49): error CS1003: Синтаксическая ошибка, ожидалось ">"
1>C:\Users\о\Desktop\ConsoleApplication1 28\ConsoleApplication128\Program.cs(39,4 8,39,49): error CS1519: Недопустимый токен ";" в объявлении класса, структуры или интерфейса
1>C:\Users\о\Desktop\ConsoleApplication1 28\ConsoleApplication128\Program.cs(39,5 1,39,53): error CS1519: Недопустимый токен "++" в объявлении класса, структуры или интерфейса
1>C:\Users\о\Desktop\ConsoleApplication1 28\ConsoleApplication128\Program.cs(40,2 8,40,29): error CS1519: Недопустимый токен "[" в объявлении класса, структуры или интерфейса
1>C:\Users\о\Desktop\ConsoleApplication1 28\ConsoleApplication128\Program.cs(40,3 2,40,33): error CS1031: Ожидался тип
1>C:\Users\о\Desktop\ConsoleApplication1 28\ConsoleApplication128\Program.cs(40,3 2,40,33): error CS1519: Недопустимый токен "=" в объявлении класса, структуры или интерфейса
1>C:\Users\о\Desktop\ConsoleApplication1 28\ConsoleApplication128\Program.cs(40,3 7,40,38): error CS1519: Недопустимый токен "[" в объявлении класса, структуры или интерфейса
1>C:\Users\о\Desktop\ConsoleApplication1 28\ConsoleApplication128\Program.cs(40,4 3,40,44): error CS1031: Ожидался тип
1>C:\Users\о\Desktop\ConsoleApplication1 28\ConsoleApplication128\Program.cs(40,4 3,40,44): error CS1519: Недопустимый токен ";" в объявлении класса, структуры или интерфейса
1>C:\Users\о\Desktop\ConsoleApplication1 28\ConsoleApplication128\Program.cs(42,2 7,42,28): error CS1519: Недопустимый токен "[" в объявлении класса, структуры или интерфейса
1>C:\Users\о\Desktop\ConsoleApplication1 28\ConsoleApplication128\Program.cs(42,3 1,42,32): error CS1031: Ожидался тип
1>C:\Users\о\Desktop\ConsoleApplication1 28\ConsoleApplication128\Program.cs(42,3 1,42,32): error CS1519: Недопустимый токен "=" в объявлении класса, структуры или интерфейса
1>C:\Users\о\Desktop\ConsoleApplication1 28\ConsoleApplication128\Program.cs(42,4 0,42,41): error CS1519: Недопустимый токен "(" в объявлении класса, структуры или интерфейса
1>C:\Users\о\Desktop\ConsoleApplication1 28\ConsoleApplication128\Program.cs(43,1 4,43,15): error CS0116: Пространство имен не может напрямую включать в себя такие члены, как поля или методы
1>C:\Users\о\Desktop\ConsoleApplication1 28\ConsoleApplication128\Program.cs(45,1 0,45,11): error CS0116: Пространство имен не может напрямую включать в себя такие члены, как поля или методы
1>C:\Users\о\Desktop\ConsoleApplication1 28\ConsoleApplication128\Program.cs(49,1 7,49,21): error CS1518: Ожидался класс, делегат, перечисление, интерфейс или структура
1>C:\Users\о\Desktop\ConsoleApplication1 28\ConsoleApplication128\Program.cs(49,5 4,49,55): error CS1001: Ожидался идентификатор
1>C:\Users\о\Desktop\ConsoleApplication1 28\ConsoleApplication128\Program.cs(49,5 7,49,60): error CS1518: Ожидался класс, делегат, перечисление, интерфейс или структура
1>C:\Users\о\Desktop\ConsoleApplication1 28\ConsoleApplication128\Program.cs(49,6 9,49,70): error CS1001: Ожидался идентификатор
1>C:\Users\о\Desktop\ConsoleApplication1 28\ConsoleApplication128\Program.cs(49,7 1,49,77): error CS1518: Ожидался класс, делегат, перечисление, интерфейс или структура
1>C:\Users\о\Desktop\ConsoleApplication1 28\ConsoleApplication128\Program.cs(56,2 8,56,29): error CS1001: Ожидался идентификатор
1>C:\Users\о\Desktop\ConsoleApplication1 28\ConsoleApplication128\Program.cs(56,3 0,56,33): error CS1518: Ожидался класс, делегат, перечисление, интерфейс или структура
1>C:\Users\о\Desktop\ConsoleApplication1 28\ConsoleApplication128\Program.cs(56,4 0,56,46): error CS1518: Ожидался класс, делегат, перечисление, интерфейс или структура
1>C:\Users\о\Desktop\ConsoleApplication1 28\ConsoleApplication128\Program.cs(56,5 5,56,56): error CS1518: Ожидался класс, делегат, перечисление, интерфейс или структура
1>C:\Users\о\Desktop\ConsoleApplication1 28\ConsoleApplication128\Program.cs(58,3 2,58,33): error CS1518: Ожидался класс, делегат, перечисление, интерфейс или структура
1>C:\Users\о\Desktop\ConsoleApplication1 28\ConsoleApplication128\Program.cs(58,4 3,58,44): error CS1518: Ожидался класс, делегат, перечисление, интерфейс или структура
1>C:\Users\о\Desktop\ConsoleApplication1 28\ConsoleApplication128\Program.cs(60,3 1,60,32): error CS1518: Ожидался класс, делегат, перечисление, интерфейс или структура
1>C:\Users\о\Desktop\ConsoleApplication1 28\ConsoleApplication128\Program.cs(62,1 3,62,14): error CS1022: Ожидалось определение типа или пространства имен, либо признак конца файла
========== Построение: успешно: 0, с ошибками: 1, без изменений: 0, пропущено: 0 ==========
0
1498 / 1213 / 821
Регистрация: 29.02.2016
Сообщений: 3,631
01.10.2016, 11:39
SnapeEye, делал в VS2015, поэтому наверное ошибки
0
1498 / 1213 / 821
Регистрация: 29.02.2016
Сообщений: 3,631
01.10.2016, 11:41
проект
Вложения
Тип файла: rar ConsoleApplication5.rar (7.0 Кб, 3 просмотров)
0
1498 / 1213 / 821
Регистрация: 29.02.2016
Сообщений: 3,631
01.10.2016, 11:44
result
Миниатюры
Многопоточный проход по матрице  
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
01.10.2016, 11:44
Помогаю со студенческими работами здесь

Многопоточный WebClient?
Добрый день форумчане. Есть приложение, и необходимость посылать запросы на сторонний API в многопоточном режиме. Какой клиент и...

Многопоточный клиент
Всем привет. Видел программы, так называемые &quot;чекер аккаунтов&quot; для каких либо соцсетей или для почты. Подскажите, как такое реализовать в...

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

Многопоточный аэропорт :)
Здравствуйте! Собственно такая задачка: Аэропорт: имеется 3 терминала, имеется неопределённое количество самолётов которые могут...

Многопоточный сервер
Доброго времени суток. Во время новогодних праздников, решил себя развлечь написанием небольшого приложения на C++ под дебианом....


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита, которое может. . .
Команды "Заполнить" и "Очистить" на форме документа
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". На примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных выбран регистр накопления, в. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru