ПОС/Лаб 5 2016

Извор: SI Wiki
Пређи на навигацију Пређи на претрагу

Лаб 5 се појављује у шестом термину вежби.

Одрицање одговорности: уз скоро све задатке из нити прошлих година дати су почетни .cpp и .h фајлови (који притом често нису доступни у штурим материјалима). С обзиром да су 2020/21 школске године на вежбама из POS-а приказани само задаци у C-у, ништа налик прошлим годинама, решења ће бити дата у духу тих C задатака из школске године 2020/21.

Група 3

Задатак 1

Поставка

(7п) Две нити, инстанце класе NitX, "производе" целе бројеве упоредо, независним и променљивим брзинама. NitY узима по два произведена броја, без обзира која је нит произвела те бројеве, и њихов збир исписује на стандардни излаз. Важно је обезбедити да NitY увек узима само "свеже" произведене бројеве, тј. никада не узме више пута исти произведени број. Није важно која нит је произвела бројеве - две нити типа NitX не треба непотребно синхронизовати нити условљавати њихову наизменичност: ако је нпр. прва спремна да произведе још један број, а друга није, онда ће прва произвести два узастопна броја која NitY сабира, и обратно. Коришћењем дељених променљивих и класичних бројачких семафора, написати овај програм. За потребе дељених променљивих користити дату класу SharedData.

Решење

#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;
}

Задатак 2

Овај задатак није решен. Помозите SI Wiki тако што ћете га решити.

Поставка

(7п) Дат је програм у коме више нити конкурентно увећава вредност дељеног бројача и затим исписује његову вредност на стандардном излазу. Исправити ово решење тако да се програм регуларно извршава.