POS/Lab 5 2016
Lab 5 se pojavljuje u šestom terminu vežbi.
Odricanje odgovornosti: uz skoro sve zadatke iz niti prošlih godina dati su početni .cpp i .h fajlovi (koji pritom često nisu dostupni u šturim materijalima). S obzirom da su 2020/21 školske godine na vežbama iz POS-a prikazani samo zadaci u C-u, ništa nalik prošlim godinama, rešenja će biti data u duhu tih C zadataka iz školske godine 2020/21.
Grupa 3
Zadatak 1
Postavka
(7p) Dve niti, instance klase NitX, "proizvode" cele brojeve uporedo, nezavisnim i promenljivim brzinama. NitY uzima po dva proizvedena broja, bez obzira koja je nit proizvela te brojeve, i njihov zbir ispisuje na standardni izlaz. Važno je obezbediti da NitY uvek uzima samo "sveže" proizvedene brojeve, tj. nikada ne uzme više puta isti proizvedeni broj. Nije važno koja nit je proizvela brojeve - dve niti tipa NitX ne treba nepotrebno sinhronizovati niti uslovljavati njihovu naizmeničnost: ako je npr. prva spremna da proizvede još jedan broj, a druga nije, onda će prva proizvesti dva uzastopna broja koja NitY sabira, i obratno. Korišćenjem deljenih promenljivih i klasičnih brojačkih semafora, napisati ovaj program. Za potrebe deljenih promenljivih koristiti datu klasu SharedData.
Rešenje
#include <pthread.h>
#include <semaphore.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>
#define THREAD_CNT 3
typedef void *(*thread_func)(void*);
typedef struct shared_data {
sem_t mutex;
sem_t ready_to_write;
sem_t ready_to_read;
int n[2];
int i;
} shared_data;
void *NitX(void *param) {
shared_data *data = (shared_data*)param;
int it = 10;
while (it-- > 0) {
usleep(rand() % 1000 * 1000);
sem_wait(&data->ready_to_write);
sem_wait(&data->mutex);
data->n[data->i] = rand() % 10;
data->i = (data->i + 1) % 2;
sem_post(&data->mutex);
sem_post(&data->ready_to_read);
}
return NULL;
}
void *NitY(void *param) {
shared_data *data = (shared_data*)param;
int it = 10;
while (it-- > 0) {
sem_wait(&data->ready_to_read);
sem_wait(&data->ready_to_read);
int res = data->n[0] + data->n[1];
printf("%d + %d = %d\n", data->n[0], data->n[1], res);
sem_post(&data->ready_to_write);
sem_post(&data->ready_to_write);
}
return NULL;
}
int main(int argc, char *argv[]) {
srand(time(0));
shared_data data;
data.i = 0;
sem_init(&data.ready_to_write, 0, 2);
sem_init(&data.ready_to_read, 0, 0);
sem_init(&data.mutex, 0, 1);
pthread_t threads[THREAD_CNT];
thread_func funcs[THREAD_CNT] = {NitX, NitX, NitY};
for (int i = 0; i < THREAD_CNT; i++)
pthread_create(&threads[i], 0, funcs[i], &data);
for (int i = 0; i < THREAD_CNT; i++)
pthread_join(threads[i], 0);
sem_destroy(&data.ready_to_write);
sem_destroy(&data.ready_to_read);
sem_destroy(&data.mutex);
printf("kraj izvršavanja\n");
return 0;
}
Zadatak 2
- Ovaj zadatak nije rešen. Pomozite SI Wiki tako što ćete ga rešiti.
Postavka
(7p) Dat je program u kome više niti konkurentno uvećava vrednost deljenog brojača i zatim ispisuje njegovu vrednost na standardnom izlazu. Ispraviti ovo rešenje tako da se program regularno izvršava.