Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторные работы по ТРС.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
201.18 Кб
Скачать

Приклад використання бар'ера

import java.util.concurrent.*; import java.util.Random; class Worker extends Thread {   CyclicBarrier barrier;   int workerNumber = 0;   Worker( CyclicBarrier b, int n) {     barrier = b;     workerNumber = n;     }   public void run() {     System.out.println( "Worker(" + workerNumber + "): start");     try {       barrier.await();       System.out.println( "Worker(" + workerNumber + "): end");       }     catch (InterruptedException e) {       e.printStackTrace();       }     catch (BrokenBarrierException e) {       e.printStackTrace();       }     }   } public class CyclicBarrierDemo {   public static void main( String args[]) {     int workersNumber = 5;     CyclicBarrier barrier = new CyclicBarrier( workersNumber, new Runnable() {       public void run() {           System.out.println( "CyclicBarrier: run");           }         });     for (int i = 0; i < workersNumber; i++) {       new Worker( barrier, i).start();       }     }   }

 

Завдання:

  1. Розглянути, вiдкомпiлювати та запустити на виконання наведенi приклади.

  2. З'ясувати принципи взємодiї та синхронiзацiї потокiв при використаннi бар'єрної синхронiзацiї.

  3. З'ясувати особливостi програмування та застосування бар'єрної синхронiзацiї.

 

Iндивiдуальнi завдання до захисту роботи

  1. Написати паралельну програму для транспонування матрицi розмiром 32n x 32n елементiв n потоками. Для збору даних вiд робочих потокiв та виводу кiнцевого результату використати метод бар'єрної синхронiзацiї. Розмiрнiсть матрицi задати як параметр у командному рядку пiд час запуску програми.

  2. Ввести загальну змiнну з початковим значенням 0. Зробити так, щоб кожен процес пiсля свого старту збiльшував її на 1. Пiсля зупинки усiх процесiв у бар'єра, вiн повинен вивести її значення на екран. Перед закiнченням роботи кожен процес повинен зменшити її значення на 1 i вивести результат на екран. Кiлькiсть процесiв задати як параметр у командному рядку пiд час запуску програми.

  3. Створити загальний масив розмiрностi N. Зробити так, щоб кожен процес пiсля свого старту збiльшував вiдповiдний елемент цього масиву на одиницю. Пiсля зупинки усiх процесiв у бар'єра вiн повинен вивести у консоль усi елементи цього масиву. Перед закiнченням роботи кожен процес повинен зменшити на одиницю значення вiдповiдної комiрки масиву та вивести результат у консоль. Розмiрнiсть масиву задати як параметр у командному рядку пiд час запуску програми.

  4. Розробити паралельну програму з двома робочими процесами та двома бар'єрами. Головний процес створює два дочiрнiх робочих процеси A i B. Процес A генерує матрицю A та iнiцiалiзує її одиницями. Процес B генерує матрицю B та iнiцiалiзує її двiйками. Пiсля чого обидва процеси зупиняються у першого бар'єра. Перший бар'єр виводить значення обох матриць у консоль. Пiсля закiнчення виводу процеси A i B обраховують матрицю C, яка є поелементною сумою матриць A i B (тобто C = A + B). Причому процес A обраховує першу половину матрицi C, а процес B - другу. Пiсля закiнчення обрахунку обидва процеси зупиняються у другого бар'єра. Другий бар'єр виводить значення матрицi C у консоль. Пiсля цього процеси припиняють роботу. Розмiрнiсть матриць задати як параметр у командному рядку пiд час запуску програми.

  5. Розробити паралельну програму з двома робочими процесами та двома бар'єрами. Головний процес створює два дочiрнiх робочих процеси A i B. Перший процес генерує матрицю вiдношення R1: x >= y (бiльше чи дорiвнює). Другий процес генерує матрицю вiдношення R2: x <= y (менше чи дорiвнює). Пiсля чого обидва процеси зупиняються у першого бар'єра. Перший бар'єр виводить значення обох матриць у консоль. Пiсля закiнчення виводу процеси A i B обраховують композицiю цих вiдношень. Причому перший процес обраховує першу половину матрицi вiдношення, а другий процес - другу. Пiсля закiнчення обрахунку обидва процеси зупиняються у другого бар'єра. Другий бар'єр виводить значення отриманої матрицi у консоль. Пiсля цього процеси припиняють роботу. Розмiрнiсть матриць задати як параметр у командному рядку пiд час запуску програми.

  6. Розробити паралельну програму з двома робочими процесами та двома бар'єрами. Головний процес створює два дочiрнiх робочих процеси A i B. Процес A генерує множину A. Процес B генерує множину B. Пiсля чого обидва процеси зупиняються у першого бар'єра. Перший бар'єр виводить значення обох матриць у консоль. Пiсля закiнчення виводу процеси A i B обраховують декартовий добуток цих множин. Причому процес A обраховує першу половину матрицi декартового добутку, а процес B - другу. Пiсля закiнчення обрахунку обидва процеси зупиняються у другого бар'єра. Другий бар'єр виводить значення матрицi декартового добутку у консоль. Пiсля цього процеси припиняють роботу. Потужнiсть множин задати як параметр у командному рядку пiд час запуску програми.

  7. Розробити паралельну програму з двома робочими процесами та двома бар'єрами. Головний процес створює два дочiрнiх робочих процеси A i B. Процес A генерує множину A. Процес B генерує множину B. Пiсля чого обидва процеси зупиняються у першого бар'єра. Перший бар'єр виводить значення обох матриць у консоль. Пiсля закiнчення виводу процеси A i B обраховують перерiз цих множин. Причому процес A обраховує першу половину перерiзу, а процес B - другу. Пiсля закiнчення обрахунку обидва процеси зупиняються у другого бар'єра. Другий бар'єр виводить значення множини перерiзу у консоль. Пiсля цього процеси припиняють роботу. Потужнiсть множин задати як параметр у командному рядку пiд час запуску програми.

  8. Розробити паралельну програму з двома робочими процесами та бар'єром. Головний процес створює два дочiрнiх робочих процеси A i B. Процес A генерує множину A. Процес B генерує множину B. Пiсля чого обидва процеси зупиняються у бар'єра. Бар'єр виконує об'єднання цих множин. Пiсля цього процес A виводить у консоль першу половину об'єднаної множини, а процес B - другу. Потужнiсть множин задати як параметр у командному рядку пiд час запуску програми.

  9. Розробити паралельну програму з трьома робочими процесами та двома бар'єрами. Головний процес створює три дочiрнiх робочих процеси A, B i C. Процес A генерує матрицю MA та iнiцiалiзує її одиницями. Процес B генерує матрицю MB та iнiцiалiзує її двiйками. Процес C генерує матрицю MC та iнiцiалiзує її трiйками. Пiсля чого усi процеси зупиняються у першого бар'єра. Перший бар'єр виводить значення усiх матриць у консоль. Пiсля закiнчення виводу процеси A B i C обраховують матрицю MD, яка є результатом такого виразу: MD = MA + MB * MC. Матриця MC - загальний ресурс, а матрицi MA i MB розбиваються на три частини та розподiляються мiж робочими процесами. Пiсля закiнчення обрахунку усi робочi процеси зупиняються у другого бар'єра. Другий бар'єр виводить значення матрицi MD у консоль. Пiсля цього процеси припиняють роботу. Розмiрнiсть матриць задати як параметр у командному рядку пiд час запуску програми.

  10. Розробити паралельну програму з трьома робочими процесами та бар'єром. Головний процес створює три дочiрнiх робочих процеси A, B i C. Процес A генерує матрицю MA та iнiцiалiзує її одиницями. Процес B генерує матрицю MB та iнiцiалiзує її двiйками. Процес C генерує матрицю MC та iнiцiалiзує її трiйками. Пiсля чого усi процеси зупиняються у першого бар'єра. Перший бар'єр збiльшує кожен елемент матриць MA, MB, та MC на одиницю. Пiсля закiнчення роботи першого бар'єра процеси A B i C здiйснюють вивiд матриць у вiдповiднi дисковi файли у форматi CSV програми Microsoft Excel. Тобто:

    • процес A здiйснює вивiд матрицi MA у файл MA.CSV;

    • процес B здiйснює вивiд матрицi MB у файл MB.CSV;

    • процес C здiйснює вивiд матрицi MC у файл MC.CSV.

Пiсля цього процеси припиняють роботу. Розмiрнiсть матриць задати як параметр у командному рядку пiд час запуску програми. Файли результату, якi були утворенi пiд час роботи програми (тобто MA.CSV, MB.CSV, MC.CSV) переглянути у програмi Microsoft Excel

  1. Розробити паралельну програму з двома робочими процесами та двома бар'єрами. Головний процес створює два дочiрнiх робочих процеси A i B. Процес A генерує матрицю MA та iнiцiалiзує її одиницями. Процес B генерує матрицю MB та iнiцiалiзує її двiйками. Пiсля чого обидва процеси зупиняються у першого бар'єра. Перший бар'єр виконує введення значень матрицi MC з дискового файлу (можна використати файл у форматi CSV). Пiсля закiнчення вводу процеси A B i C обраховують матрицю MD, яка є результатом такого виразу MD = MA + MB * MC. Матриця MC - загальний ресурс, а матрицi MA i MB розбиваються на двi частини та розподiляються мiж робочими процесами. Пiсля закiнчення обрахунку усi робочi процеси зупиняються у другого бар'єра. Другий бар'єр виводить значення матрицi MD у консоль. Пiсля цього процеси припиняють роботу. Розмiрнiсть матриць та назву файлу даних з матрицею MC задати як параметр у командному рядку пiд час запуску програми.

 

Лабораторна робота №15.

Тема: Блокуючи черги.

Мета: