Advertisement
Guest User

Untitled

a guest
Apr 4th, 2020
155
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.43 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <unistd.h>
  5. #include <sys/types.h>
  6. #include <sys/stat.h>
  7. #include <fcntl.h>
  8. #include <assert.h>
  9. #include <errno.h>
  10. #include <pthread.h>
  11.  
  12. pthread_mutex_t *chopsticks;
  13. int LAST;
  14.  
  15. struct filosofo {
  16.     int id;
  17.     pthread_t tid;
  18. };
  19.  
  20. void inizializza(int N) {
  21.     LAST = N - 1;
  22.     chopsticks = malloc(sizeof(pthread_mutex_t) * N);
  23.     for (int i = 0; i < N; i++)
  24.         if (pthread_mutex_init(&chopsticks[i], NULL))
  25.             error("pthread_mutex_init");
  26. }
  27.  
  28. void medita() {
  29.     int n = rand() % 1000000 + 1;
  30.     usleep(n);
  31. }
  32.  
  33. void mangia() {
  34.     int n = rand() % 2000000 + 1;
  35.     usleep(n);
  36. }
  37.  
  38. void* filosofeggia(void* arg) {
  39.     int id = (int) arg;
  40.  
  41.     for (int i = 0; i < 5; i++) {
  42.         printf("il filosofo %d sta meditando...\n", id);
  43.         medita();
  44.  
  45.         if (pthread_mutex_lock(&chopsticks[id]))
  46.             perror("prendendo la forchetta sinistra..");
  47.         if (id == LAST) {
  48.             if (pthread_mutex_lock(&chopsticks[0]))
  49.                 perror("prendendo la forchetta destra..");
  50.             printf("il filosofo %d ha acquisito le forchette\n", id);
  51.             mangia();
  52.             printf("il filosofo %d ha finito di mangiare\n", id);
  53.             pthread_mutex_unlock(&chopsticks[0]);
  54.             pthread_mutex_unlock(&chopsticks[id]);
  55.         } else {
  56.             if (pthread_mutex_lock(&chopsticks[id+1]))
  57.                 perror("prendendo la forchetta destra..");
  58.             printf("il filosofo %d ha acquisito le forchette\n", id);
  59.             mangia();
  60.             printf("il filosofo %d ha finito di mangiare\n", id);
  61.             pthread_mutex_unlock(&chopsticks[id+1]);
  62.             pthread_mutex_unlock(&chopsticks[id]);
  63.         }
  64.     }
  65.     sleep(1);
  66.     return (void*) 0;
  67. }
  68.  
  69. int main(int argc, char const *argv[])
  70. {
  71.     int N;
  72.  
  73.     if (argc != 2) {
  74.         perror("Checking the arguments:");
  75.         printf("insert the numers of philosofers: INT\n");
  76.         exit(EXIT_FAILURE);
  77.     }
  78.     sscanf(argv[1], "%d", &N);
  79.     if (N < 2) {
  80.         perror("Numbers of philosofers:");
  81.         printf("insert a number >= 2\n");
  82.         exit(EXIT_FAILURE);
  83.     }
  84.    
  85.     inizializza(N);
  86.     struct filosofo *filosofi[N];
  87.     for(int i = 0; i < N; i++) {
  88.         int status;
  89.         int err;
  90.         filosofi[i] = malloc(sizeof(struct filosofo));
  91.         filosofi[i]-> id = i;
  92.         if ((err = pthread_create(&filosofi[i]->tid, NULL, &filosofeggia, (void*) filosofi[i]->id)) != 0) {
  93.             perror("creating thread:");
  94.             exit(EXIT_FAILURE);
  95.         }
  96.     }
  97.  
  98.     for (int i = 0; i < N; i++) {
  99.         pthread_join(filosofi[i]->tid, NULL);
  100.         printf("filosofo %d ha terminato di mangiare per 5 volte\n", filosofi[i]->id);
  101.     }
  102.  
  103.     return 0;
  104. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement