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