Program- problem pięciu filozofów

0

Cześć wszystkim , jestem początkującym mam kod programu problem pięciu filozofów na wątkach , i chciałem się dowiedzieć co się dzieje w tym programie a mianowicie np. gdzie w tym kodzie są wątki , sekcja krytyczna , semafory i inne rzeczy. Jeśli ktoś mógłby objaśnić ten program z góry dzięki.
Poniżej kod:

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
#include <ncurses.h>
void* func(int n);
pthread_t filozof[5];
pthread_mutex_t widelec[5];
int rozmiar = 1, height, width;
WINDOW* new;
int main()
{

    initscr();
    cbreak();

    start_color();
    init_pair(1, COLOR_YELLOW, COLOR_BLACK);
    init_pair(2, COLOR_CYAN, COLOR_BLACK);
    attron(COLOR_PAIR(1));

    new = newwin(height - 8, width - 20, 10, 20);
    wrefresh(new);
    box(new, 0, 0);

    wrefresh(new);

    attron(A_BOLD);
    mvprintw(0, 1, "PROBLEM 5 FILOZOFOW\n");
    attron(COLOR_PAIR(2));
    attron(A_DIM);
    mvprintw(2, 0, "Pięciu filozofów siedzi przy stole i każdy wykonuje jedną z dwóch czynności – albo je, albo rozmyśla. Stół jest okrągły, przed każdym z nich znajduje się miska ze spaghetti, a pomiędzy każdą sąsiadującą parą filozofów leży widelec, a więc każda osoba ma przy sobie dwie sztuki – po swojej lewej i prawej stronie. Ponieważ jedzenie potrawy jest trudne przy użyciu jednego widelca, zakłada się, że każdy filozof korzysta z dwóch. Dodatkowo nie ma możliwości skorzystania z widelca, który nie znajduje się bezpośrednio przed daną osobą.");
    attron(A_UNDERLINE);
    mvprintw(4, 0, "Nacisnij dowolny klawisz, aby rozwiazac problem!\n");
    attroff(A_BOLD);
    getch();
    clear();
    wrefresh(new);

    getmaxyx(stdscr, height, width);
    new = newwin(height - 1, width - 1, 1, 1);
    scrollok(new, TRUE);
    wrefresh(new);
    int i, k;
    void* msg;
    for (i = 1; i <= 5; i++) {
        k = pthread_mutex_init(&widelec[i], NULL);
        if (k == -1) {
            printf("\n Blad w inicjalizacji Mutex'a");
            exit(1);
        }
    }
    for (i = 1; i <= 5; i++) {
        k = pthread_create(&filozof[i], NULL, (void*)func, (int*)i);
        if (k != 0) {
            printf("\n Blad w tworzeniiu watku \n");
            exit(1);
        }
    }
    for (i = 1; i <= 5; i++) {
        k = pthread_join(filozof[i], &msg);
        if (k != 0) {
            printf("\n Thread join zakonczylo sie niepowodzeniem \n");
            exit(1);
        }
    }
    for (i = 1; i <= 5; i++) {
        k = pthread_mutex_destroy(&widelec[i]);
        if (k != 0) {
            printf("\n Mutex zostal zniszczony \n");
            exit(1);
        }
    }
    return 0;
}
void* func(int n)
{
    printf("\r\nFilozof %d mysli ", n);
    pthread_mutex_lock(&widelec[n]);
    pthread_mutex_lock(&widelec[(n + 1) % 5]);
    printf("\r\nFilozof %d je ", n);
    sleep(3);
    pthread_mutex_unlock(&widelec[n]);
    pthread_mutex_unlock(&widelec[(n + 1) % 5]);
    printf("\r\nFilozof %d skonczyl jesc ", n);
}

0

func jest wykonywana na innym wątku (tu filozof je).
Ten kod ma błąd zakleszczenia (o to chodzi w problemie jedzących filozofów, by rozwiązać to zakleszczenie).
Błąd zakleszczenia polega na tym, że wszyscy filozofowie trzymają w ręce lewy widelec i czekają na prawy widelec, aż sąsiad go odda (wszyscy czekają na widelec w nieskończoność).

Kod jest nieprawidłowy, jeszcze dlatego, że źle używa pthread_create

1 użytkowników online, w tym zalogowanych: 0, gości: 1