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

  1. Написати паралельну програму iз загальною змiнною типу integer та двома робочими процесами. Загальнiй змiннiй на початку роботи програми надати значення 3. Кожен робочий процес пiд час роботи програми повинен п'ять разiв звернутися до загальної змiнної i кожного разу збiльшити її значення на 1. Таким чином у кiнцi роботи програми загальна змiнна повинна мiстити значення 3 + 5 +5 = 13. Процеси повиннi працювати паралельно i незалежно один вiд одного. Програма повинна працювати вiрно навiть якщо пiд час виконання операцiї додавання ввести випадкову часову затримку.
  2. Написати паралельну програму iз загальною змiнною типу String та двома робочими процесами. Загальнiй змiннiй на початку роботи програми надати значення "Start:". Кожен робочий процес пiд час роботи програми повинен п'ять разiв звернутися до загальної зм_нної i кожного разу додавати у її кiнець по однiй лiтерi. Перший процес повинен додавати лiтеру "A", а другий "B". Таким чином у кiнцi роботи програми загальна змiнна повинна мiстити приблизно таке значення "Start:ABBAAABABB". Процеси повиннi працювати паралельно i незалежно один вiд одного. Програма повинна працювати вiрно навiть якщо пiд час виконання операцiї додавання ввести випадкову часову затримку.
  3. Дано рядок лiтер приблизно такого виду "ABCDEFABCDEF:". Написати паралельну програму з двома робочими процесами. Кожен робочий процес пiд час роботи програми повинен звертатися до цього рядка та виконувати у ньому такi замiни:
    • Перший процес замiнює лiтеру A на лiтеру Q.
    • Другий процес замiнює лiтеру B на лiтеру R.

За одне звернення процес може замiнити тiльки одну лiтеру. Процеси повиннi працювати паралельно i незалежно один вiд одного. Програма повинна працювати вiрно навiть якщо пiд час виконання операцiї замiни ввести випадкову часову затримку.

  1. Дано рядок лiтер приблизно такого виду "ABCDEFABCDEF:". Написати паралельну програму з двома робочими процесами. Кожен робочий процес пiд час роботи програми повинен звертатися до цього рядка та виконувати у ньому такi замiни:
    • Перший процес додає свiй номер пiсля кожної знайденої лiтери A.
    • Другий процес додає свiй номер пiсля кожної знайденої лiтери B.

За одне звернення процес може здiйснити тiльки одне додавання. Процеси повиннi працювати паралельно i незалежно один вiд одного. Програма повинна працювати вiрно навiть якщо пiд час виконання операцiї додавання ввести випадкову часову затримку.

  1. Написати паралельну програму iз загальною змiнною типу String та двома робочими процесами. Перший процесс повинен генерувати цифри (вiд 0 до 9) та зберiгати їх у загальну змiнну, поступово створюючи рядок приблизно такого виду: "34175428457920". Другий процес пiд час генерацiї рядка повинен пiсля кожної парної цифри додавати у нього лiтеру "A". За одне звернення до загальної змiнної перший процес може здiйснити тiльки одне додавання цифри, а другий - не бiльше одного додавання лiтери. Процеси повиннi працювати паралельно i незалежно один вiд одного. Програма повинна працювати вiрно навiть якщо пiд час виконання операцiї додавання ввести випадкову часову затримку.

 


 

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

Тема: Органiзацiя мiжпотокової взаємодiї за допомогою семафорiв.

Мета: Опанувати принципи мiжпотокової взаємодiї за допомогою семафорiв.

 

Теоретичнi вiдомостi

Простий семафор

Простий семафор має два методи take() i release().

public class Semaphore { private boolean signal = false; public synchronized void take() { this.signal = true; this.notify(); } public synchronized void release() throws InterruptedException{ while(!this.signal) wait(); this.signal = false; } }

Метод take() отримує сигнал та зберiгає його у внутрiшньому буферi.

Метод release() постiйно перебуває у станi чекання цього сигналу, i коли його отримує, вiдразу звiльняє внутрiшнiй буфер.

Це дозволяє не втратити сигнал i пiдвищити стабiльнiсть системи.

Навiдь якщо виклик take() вiдбудеться ранiше нiж release(), сигнал не буде втрачено, бо вiн зберiгається у внутрiшньому буферi семафора.

Фактично методи take() i release() замiнюють notify() i wait(), але завдяки буферизацiї, забезпечують бiльшу захищнiсть та стабiльнiсть системи.