Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
20 / 20 / 15
Регистрация: 22.01.2013
Сообщений: 76

Неправильная синхронизация задач

29.03.2014, 23:14. Показов 543. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!
Есть такая задача: реализовать паралельное вычисление формулы: A = B * MC (где A, B - массивы, MC - матрица). Вычисление на четырех процессорах. Реализация с помощью мониторов с синхронизацией. Ввод B - 4 процессор, MC - 3 процессор. Вывод А на 4м процессоре.

Первая проблема состоит в том что считает неправильно - выводит массив, каждый из элементов которого равен 4. Второе то, что иногда программа просто зависает не выводя ничего, думаю что дело здесь в неправильной синхронизации.

Буду рад любым советам которые подтолкнут к решению проблемы.

lab5.java
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class lab5 {
    static final int N = 100;
    static final int H = N/4;
    static monitorA A = new monitorA();
    static monitorB B = new monitorB();
    static monitorMC MC = new monitorMC();
 
    static firstThread first = new firstThread(0, H);
    static secondThread second = new secondThread(H, 2 * H);
    static thirdThread third = new thirdThread(2 * H, 3 * H);
    static fourthThread fourth = new fourthThread(3* H, 4 * H);
 
    public static void main(String[] args){
        try{
            first.t.join();
            second.t.join();
            third.t.join();
            fourth.t.join();
        }
        catch (InterruptedException e){
            System.out.println(e.getMessage());
        }
    }
}
monitorA.java
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class monitorA {
    private int[] _A = new int[lab5.N];
    int counter = 0;
    synchronized public int get(int i){
        while(counter != lab5.N * lab5.N)
            try{
                wait();
            }
            catch (InterruptedException e){}
        notify();
        return _A[i];
    }
    synchronized public void set(int i, int value){
        counter++;
        _A[i] = value;
    }
}
monitorB.java
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class monitorB {
    private int[] _B = new int[lab5.N];
    boolean flag = false;
 
    synchronized public int get(int i){
        while(!flag)
        try{
            wait();
        }
        catch (InterruptedException e){}
        notify();
        return _B[i];
    }
 
    synchronized public void set(){
        for (int i = 0; i < lab5.N; i++)
            _B[i] = 2;
        flag = true;
    }
}
monitorMC.java
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class monitorMC {
    private int[][] _MC = new int[lab5.N][lab5.N];
    boolean flag = false;
 
    synchronized public int get(int i, int j){
        while(!flag)
        try{
            wait();
        }
        catch (InterruptedException e){}
        notify();
        return _MC[i][j];
    }
    synchronized public void set(){
        for (int i = 0; i < lab5.N; i++)
            for (int j = 0; j < lab5.N; j++)
                _MC[i][j] = 2;
        flag = true;
    }
}
firstThread
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class firstThread implements Runnable{
    Thread t;
    private int _min;
    private int _max;
    firstThread(int min, int max){
        _min = min;
        _max = max;
        t = new Thread(this);
        t.start();
    }
    public void run(){
        int[] temp = new int[lab5.N];
        for (int i = 0; i < lab5.N; i++)
            for (int j = _min; j < _max; j++)
                lab5.A.set(i, temp[i] + lab5.MC.get(j,i) * lab5.B.get(j));
    }
}
secondThread.java
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class secondThread implements Runnable{
    Thread t;
    private int _min;
    private int _max;
    secondThread(int min, int max){
        _min = min;
        _max = max;
        t = new Thread(this);
        t.start();
    }
    public void run(){
        int[] temp = new int[lab5.N];
        for (int i = 0; i < lab5.N; i++)
            for (int j = _min; j < _max; j++)
                lab5.A.set(i, temp[i] + lab5.MC.get(j,i) * lab5.B.get(j));
    }
}
thirdThread.java
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class thirdThread implements Runnable{
    Thread t;
    private int _min;
    private int _max;
 
    thirdThread(int min, int max){
        _min = min;
        _max = max;
        t = new Thread(this);
        t.start();
    }
    public void run(){
        int[] temp = new int[lab5.N];
 
         lab5.MC.set();
 
        for (int i = 0; i < lab5.N; i++)
            for (int j = _min; j < _max; j++){
                temp[i] += lab5.MC.get(j,i) * lab5.B.get(j);
                lab5.A.set(i, temp[i]);
            }
    }
}
fourthThread.java
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class fourthThread implements Runnable{
    Thread t;
    private int _min;
    private int _max;
    fourthThread(int min, int max){
        _min = min;
        _max = max;
        t = new Thread(this);
        t.start();
    }
    public void run(){
        int[] temp = new int[lab5.N];
        lab5.B.set();
        //calc
        for (int i = 0; i < lab5.N; i++)
            for (int j = _min; j < _max; j++)
                lab5.A.set(i, temp[i] + lab5.MC.get(j,i) * lab5.B.get(j));
        //out result
        for (int i = 0; i < lab5.N; i++)
            System.out.print(lab5.A.get(i) + " ");
    }
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
29.03.2014, 23:14
Ответы с готовыми решениями:

Синхронизация задач
есть 2 независимые задачи. Обе должны получать доступ к модулю wifi. Каждая из задач при...

Синхронизация задач FreeRTOS на разных контроллерах
Добрый день! Подскажите, как организовать синхронизацию (одинаковых) задач FriiRTOS на нескольких...

Модуль EVO II синхронизация 50гц, На какой ножке контроллера синхронизация шим двигателя?
Частый дефект для модулей EVO II с коллекторным двигателем - нет управления двигателем при помехах...

1
Эксперт Java
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
29.03.2014, 23:44
Ох, у вас тут целый ворох проблем...
1. Все вызовы notify перенесите в конец метода set. Зачем он у вас вообще в get?
2. Замените notify на notifyAll - у вас же может несколько потоков ждать заполнения.
3. Код первого и второго потока должен быть один и тот же. Зачем вам два класса для них?
3. Сам код перемножения у вас должен быть один и тот же. Почему он у вас отличается в разных потоках?
4. Попробуйте, для начала, добиться корректности в варианте когда само умножение делает только один поток.
То есть чтобы программа работала корректно, если потоки, например, создаются так:
Java
1
2
3
4
    static firstThread first = new firstThread(0, 0);
    static secondThread second = new secondThread(0, N);
    static thirdThread third = new thirdThread(0, 0);
    static fourthThread fourth = new fourthThread(0, 0);
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
29.03.2014, 23:44
Помогаю со студенческими работами здесь

Где можно скачать книги с примерами решениями задач задач по программированию
подскажите где можно скачать книги с примерами решениями задач задач по программированию (что бы...

Посоветуйте хорошие практикумы по решению задач на C# с разбором этих задач!
Очень нужно

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

Сколько комплектов задач можно составить из имеющихся задач?
В одном комплекте должно быть 3 задачи. Задачи в комплекте должны относится к разным темам....

Машинное обучение. Отличие задач прогнозирования от задач регрессии
Доброго времени суток. Столкнулся с таким вопросом: Имеется файл вида x0 x1 x2 ...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Ниже машинный перевод статьи The Thinkpad X220 Tablet is the best budget school laptop period . Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы,. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
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
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru