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

Многопоточное умножение матриц не работает без Thread.Sleep

27.03.2016, 23:08. Показов 588. Ответов 0
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Задача состоит в том, чтобы перемножить две матрицы n*m и m*k вычисляя произведение векторов в n*k процесах и продемонстрировать непоследовательный порядок вычисления элементов матрицы. Вот моя реализация. Проблема состоит в том что без строчки Thread.Sleep(1) в перегруженном операторе умножения функция VectorMult вызывается с неправильными параметрами i,j и вылетает исключение, а с Thread.Sleep(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
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
using System;
using System.Threading;
using System.Collections.Generic;
 
namespace MatrixMultiplication
{
    class Matrix
    {
        public int Row{get; set;}
        public int Column { get; set;}
        double[,] arr;
        Matrix() { }
        public Matrix(int row,int column)
        {
            Row = row;
            Column = column;
            arr = new double[row, column];
        }
        public double[] GetColumn(int i)
        {
            double[] res=new double[Row];
            for (int j = 0; j < Row; j++)
                res[j] = arr[j, i];
            return res;
        }
        public double[] GetRow(int i)
        {
            double[] res = new double[Column];
            for (int j = 0; j < Column; j++)
                res[j] = arr[i, j];
            return res;
        }
        public double this[int i,int j]
        {
            get { return arr[i, j]; }
            set { arr[i, j] = value; }
        }
        public Matrix RandomValues()
        {
            Random rnd=new Random();
            for (int i = 0; i < Row; i++)
                for (int j = 0; j < Column; j++)
                    arr[i, j] =rnd.Next(10);
            return this;
        }
 
        public void Print()
        {
            for(int i=0;i<Row;i++){
                for (int j = 0; j < Column; j++)
                    Console.Write(arr[i,j]+" ");
                Console.WriteLine();
            }
        }
 
        public static Matrix operator*(Matrix a, Matrix b)
        {
            Matrix result=new Matrix(a.Row,b.Column);
            List<Thread> threads = new List<Thread>();
            for (int i = 0; i < a.Row; i++)
                for (int j = 0; j < b.Column; j++)
                {
                    threads.Add(new Thread(delegate() { VectorMult(i, j,a,b,result); }));
                    threads[threads.Count - 1].Start();
                    Thread.Sleep(1);
                }
           for (int i = 0; i < threads.Count; i++)
                threads[i].Join();
            return result;
        }
 
        public  static void VectorMult(int i,int j,Matrix a, Matrix b,Matrix result){
            double[] x = a.GetRow(i);
            double[] y = b.GetColumn(j);
            for (int k = 0; k < x.Length; k++)
                result[i, j] += x[k] * y[k];
            Console.WriteLine("element result{0}{1} is calculated", i, j);
        }
    }
 
     class Program
    {
        static void Main(string[] args)
        {
            int n = int.Parse(Console.ReadLine());
            int m = int.Parse(Console.ReadLine());
            int k = int.Parse(Console.ReadLine());
            Matrix A = new Matrix(n,m).RandomValues();
            Matrix B = new Matrix(m,k).RandomValues();
            A.Print();
            Console.WriteLine(new String('-',20));
            B.Print();
            Console.WriteLine(new String('-', 20));
            Matrix C = A * B;
            C.Print();
        }
    }
 
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
27.03.2016, 23:08
Ответы с готовыми решениями:

Многопоточное умножение матриц
Программа периодически (примерно 1 раз из трех запусков) выводит ошибку о выходе из пределов диапазона. Задание: многопоточно перемножить 2...

Многопоточное умножение матриц
Всем привет! как создать несколько потоков и передать им параметры, потом остановить и запустить одновременно. пытаюсь понять работу с...

Дождаться выполнения Task без Thread.Sleep?
using System; public class Test { public static void Main() { Console.WriteLine(&quot;1&quot;); var task = new...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
27.03.2016, 23:08
Помогаю со студенческими работами здесь

Thread.Sleep не работает
Всем привет! Задача такая есть таймер который запускается каждый 30 сек и делает рассылку и уведомление Но когда наступает время (1 мин...

Тестирование клиент-серверного приложения без Thread.Sleep ?
Есть пока что небольшой вебсокет-сервер. При покрытии этого сервера NUnit-тестами передо мной встал вопрос: а как собственно правильно...

Умножение матриц без использования рекурсии
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication14 { ...

Как использовать Thread.Sleep(5000), ошибка: "Элемент "Thread" не существует в текущем контексте"
я так понимаю, что Thread.Sleep(5000); это &quot;тормоз&quot; процесса выполенения программы на 5 сек? А как его правильно инициализировать и...

Аналог Thread.Sleep
когда вызываешь функцию Вызываю слип в потоке Thread.Sleep(300000) ТО программа начинает криво работать в чем дело ?


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
PowerShell Snippets
iNNOKENTIY21 11.11.2025
Модуль PowerShell 5. 1+ : Snippets. psm1 У меня модуль расположен в пользовательской папке модулей, по умолчанию: \Documents\WindowsPowerShell\Modules\Snippets\ А в самом низу файла-профиля. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru