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

КСМ-09-1

Болюх Юлії

Лабораторна робота №4

Тема: Умовні змінні. Монітори.

Мета: Використати механізм умовних змінних та моніторів для реалізації паралельних алгоритмів; розглянути; навчитися вирішувати задачу розподілу ресурсів; навчитися використовувати глобальні інваріанти для аналізу та розробки паралельних програм.

Хід роботи

1. Розглянути приклад 5.1 лекції 5. Переробити програму таким чином, щоб потік Т2 очікував число, що буде більше за (50+І), де І – номер варіанту студента.

Алгоритм роботи кожного потоку

Тгол

Т1

Т2

1)Ініціалізація мютексів

2)Ініціалізація умовних змінних

3)Створення потоків

4)Приєднання потоків

1)Сигнал про створення Т1

2)Очикування створення Т2

3)Генерування випадкового числа q

4)Якщо q%5==0, то

q%5==0

- сигналізувати в Т2

- очікування готовності

-завершення роботи

5) повернутися в п.3

1)Сигнал про створення

Т2

2)Очікування створення Т1

3)Сигнал про готовність виведення

4)Очікування доки q>50+I

5)Виведення.

Лістинг програми

#include <pthread.h>

#include <iostream>

#include <time.h>

#include <stdlib.h>

using namespace std;

int q;

const int i=4;

pthread_cond_t condCreate, condDiv;

pthread_mutex_t mutexCreate, mutexDiv;

int fcT1 = 0, fcT2 = 0; //Flags for creating threads

int fmod = 0; //flag for mod 5

int fout = 0; //flag for out

void *funcT1(void *arg)

{

pthread_mutex_lock(&mutexCreate);

cout<<"T1 was create"<<'\n';

fcT1 = 1;

if (fcT2 == 0)

{

pthread_cond_wait(&condCreate,&mutexCreate);

}

else

{

pthread_cond_signal(&condCreate);

}

pthread_mutex_unlock(&mutexCreate);

while (fmod == 0)

{

srand(time(NULL));

q = 1 + rand()%100;

if (q>50+i)

{

pthread_mutex_lock(&mutexDiv);

fout++;

if (fout < 2)

{

pthread_cond_wait(&condDiv,&mutexDiv);

}

else

{

pthread_cond_signal(&condDiv);

}

pthread_mutex_unlock(&mutexDiv);

fmod=1;

}

}

}

void *funcT2(void *arg)

{

pthread_mutex_lock(&mutexCreate);

cout<<"T2 was create"<<'\n';

fcT2 = 1;

if (fcT1 == 0)

{

pthread_cond_wait(&condCreate,&mutexCreate);

}

else

{

pthread_cond_signal(&condCreate);

}

pthread_mutex_unlock(&mutexCreate);

pthread_mutex_lock(&mutexDiv);

fout++;

if (fout < 2)

{

pthread_cond_wait(&condDiv,&mutexDiv);

}

else

{

pthread_cond_signal(&condDiv);

}

pthread_mutex_unlock(&mutexDiv);

cout<<q<<'\n';

}

int main (int argc, char *argv[])

{

pthread_mutex_init(&mutexCreate,NULL);

pthread_mutex_init(&mutexDiv,NULL);

pthread_cond_init(&condCreate,NULL);

pthread_cond_init(&condDiv,NULL);

pthread_t T1,T2;

pthread_create(&T1,NULL,funcT1,NULL);

pthread_create(&T2,NULL,funcT2,NULL);

pthread_join(T1,NULL);

pthread_join(T2,NULL);

return 0;

}

  1. Розглянути приклад 5.2 лекції 5. Переробити програму таким чином, щоб кожним потоком виконувалася функція F, під якою розуміється набір операцій aі=(aі-1+aі+1)*С, де С – номер варіанту студента.

Алгоритм роботи кожного потоку.

Потік з номером j буде виконувати наступні дії:

1)bi=ai

2) Бар’єр

3) aі= .( bі-1+bі+1)*С

4)Бар’єр.

5)I=I-1;

6)якщо І більше нуля, то завершення

Лістинг програми

#include <pthread.h>

#include <iostream>

#include <stdlib.h>

using namespace std;

const int N = 10;const int C=4;

int Iter = 1;

int a[N],b[N];int CountWait = 0;

pthread_cond_t cond;

pthread_mutex_t mutex;

void barrier()

{

pthread_mutex_lock(&mutex);

CountWait++;

if (CountWait < N-2)

{

pthread_cond_wait(&cond,&mutex);

}

else

{

CountWait = 0;

pthread_cond_broadcast(&cond);

}

pthread_mutex_unlock(&mutex);

}

void *funcT(void *arg)

{

int j = (int)arg;

int i = 0;

for (i=0; i < Iter; i++)

{

b[j]=a[j];

barrier();

a[j]=(a[j-1]+a[j+1])*C;

barrier();

}

}

int main(int argc, char *argv[])

{

int i;

Iter = atoi (argv[1]); for (i=0; i<=N-1; i++)

{

a[i]=1;

b[i]=1;

cout<<a[i]<<'\t';

}

cout<<'\n';

pthread_cond_init(&cond,NULL);

pthread_mutex_init(&mutex,NULL);

pthread_t T[N-2];

for (i=0; i< N-2; i++)

{

pthread_create(&T[i],NULL,funcT,(void *) (i+1));

}

for (i=0; i< N-2; i++)

{

pthread_join(T[i],NULL);

}

for (i=0; i<=N-1; i++)

{

cout<<a[i]<<'\t';

}

cout<<'\n';

return 0;

}

  1. Розглянути приклад 6.1 лекції 6. Переробити програму таким чином, щоб потік Т2 помножив отримане значення на 7, і якщо результат більше за номер варіанту студента, він має записати в temp значення 1, а якщо менше – значення 0. При цьому потік Т1 має очікувати відповіді від Т2, а потім зчитати відповідь зі змінної temp і вивести на екран.

Тгол

Т1

Т2

1) Ініціалізація монітору.

2) Створити потоки.

3) Приєднати потоки.

1) Генерувати випадкове число q.

2) Записати випадкове число в temp.

3) Сигнал про запис в temp.

4)Очикування Т2

5) Зчитати і вивести temp на екран.

1) Очікувати запис в temp.

2)q=q*7

3)Якщо q>v

то в temp заносимо 1, якщо менше то 0

4) Сигнал в Т1

#include <pthread.h>

#include <iostream>

#include <stdlib.h>

#include <time.h>

using namespace std;

const int v=4;

struct Monitor

{

private:

int temp;

int F;

pthread_mutex_t mutex;

pthread_cond_t cond;

public:

void MonitorInit()

{

F = 0;

pthread_mutex_init(&mutex,NULL);

pthread_cond_init(&cond,NULL);

}

void WaitTemp()

{

pthread_mutex_lock(&mutex);

if (F == 0)

pthread_cond_wait(&cond,&mutex);

pthread_mutex_unlock(&mutex);

}

void SignalTemp()

{

F++;

pthread_cond_signal(&cond);

}

void InputTemp(int q)

{

temp = q;

}

int OutputTemp()

{

return temp;

}

};

Monitor Mon;

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]