Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <unistd.h>
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <fcntl.h>
- #include <assert.h>
- #include <errno.h>
- #include <pthread.h>
- pthread_mutex_t *chopsticks;
- int LAST;
- struct filosofo {
- int id;
- pthread_t tid;
- };
- void inizializza(int N) {
- LAST = N - 1;
- chopsticks = malloc(sizeof(pthread_mutex_t) * N);
- for (int i = 0; i < N; i++)
- if (pthread_mutex_init(&chopsticks[i], NULL))
- error("pthread_mutex_init");
- }
- void medita() {
- int n = rand() % 1000000 + 1;
- usleep(n);
- }
- void mangia() {
- int n = rand() % 2000000 + 1;
- usleep(n);
- }
- void* filosofeggia(void* arg) {
- int id = (int) arg;
- for (int i = 0; i < 5; i++) {
- printf("il filosofo %d sta meditando...\n", id);
- medita();
- if (pthread_mutex_lock(&chopsticks[id]))
- perror("prendendo la forchetta sinistra..");
- if (id == LAST) {
- if (pthread_mutex_lock(&chopsticks[0]))
- perror("prendendo la forchetta destra..");
- printf("il filosofo %d ha acquisito le forchette\n", id);
- mangia();
- printf("il filosofo %d ha finito di mangiare\n", id);
- pthread_mutex_unlock(&chopsticks[0]);
- pthread_mutex_unlock(&chopsticks[id]);
- } else {
- if (pthread_mutex_lock(&chopsticks[id+1]))
- perror("prendendo la forchetta destra..");
- printf("il filosofo %d ha acquisito le forchette\n", id);
- mangia();
- printf("il filosofo %d ha finito di mangiare\n", id);
- pthread_mutex_unlock(&chopsticks[id+1]);
- pthread_mutex_unlock(&chopsticks[id]);
- }
- }
- sleep(1);
- return (void*) 0;
- }
- int main(int argc, char const *argv[])
- {
- int N;
- if (argc != 2) {
- perror("Checking the arguments:");
- printf("insert the numers of philosofers: INT\n");
- exit(EXIT_FAILURE);
- }
- sscanf(argv[1], "%d", &N);
- if (N < 2) {
- perror("Numbers of philosofers:");
- printf("insert a number >= 2\n");
- exit(EXIT_FAILURE);
- }
- inizializza(N);
- struct filosofo *filosofi[N];
- for(int i = 0; i < N; i++) {
- int status;
- int err;
- filosofi[i] = malloc(sizeof(struct filosofo));
- filosofi[i]-> id = i;
- if ((err = pthread_create(&filosofi[i]->tid, NULL, &filosofeggia, (void*) filosofi[i]->id)) != 0) {
- perror("creating thread:");
- exit(EXIT_FAILURE);
- }
- }
- for (int i = 0; i < N; i++) {
- pthread_join(filosofi[i]->tid, NULL);
- printf("filosofo %d ha terminato di mangiare per 5 volte\n", filosofi[i]->id);
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement