Advertisement
BiRabittoh

Due threads giocano a dadi

Jan 11th, 2018
126
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.05 KB | None | 0 0
  1.  /*
  2.   * Svolgi un gioco di dadi utilizzando i meccanismi di thread e mutex.
  3.   * Il primo thread deve lanciare un dado e comunicarne il risultato al secondo.
  4.   * Il secondo thread tira un secondo dado e leggendo il valore del dado del primo thread decreta il vincitore. Il secondo thread chiederà al primo se vorrà giocare di nuovo con i dadi.
  5.   * Se il primo thread accetta (mediante una risposta diretta dell'utente) si tireranno di nuovo i dadi dopo aver restituito l'info al secondo thread.
  6.   * In caso contrario si chiude l'esecuzione. Il thread primario deve attendere lo stato di terminazione del secondo thread.
  7.   */
  8. #include <stdio.h>
  9. #include <stdlib.h>
  10. #include <unistd.h>
  11. #include <pthread.h>
  12. #include <sys/types.h>
  13. #include <string.h>
  14.  
  15. #define FACCE 12
  16.  
  17. void * gestore_thread(void * argomento);
  18. int run = 1, res;
  19. pthread_mutex_t mut1, mut2;
  20.  
  21. int main(void){
  22.     pthread_t thread;
  23.     srand(getpid());
  24.     pthread_mutex_init(&mut1, NULL);
  25.     pthread_mutex_init(&mut2, NULL);
  26.     int num1;
  27.    
  28.     while (run){
  29.         //1. il primo thread lancia un dado
  30.         pthread_mutex_lock(&mut1);
  31.         num1 = rand() % FACCE + 1;
  32.         printf("\nA: Ho tirato il primo dado, mi e' uscito %d.\n", num1);
  33.         //2. crea il secondo thread mandandogli il risultato e poi si blocca
  34.         res = pthread_create(&thread, NULL, gestore_thread, (void *)num1);
  35.         if(res){
  36.             puts("Errore nella pthread_create!!");
  37.             exit(EXIT_FAILURE);
  38.         }
  39.        
  40.         printf("A: Ho creato il secondo thread. Ora vado a dormire.\n");
  41.         pthread_mutex_lock(&mut1);
  42.         //6. si sveglia. due casi
  43.         printf("\nA: Sono di nuovo sveglio. Mh fammi pensare... 1 = continua, 0 = esci\n");
  44.         scanf("%d", &run);
  45.         //7a. se accetta, restituisce l'info al secondo thread che fa la join e si ricomincia il ciclo while
  46.         pthread_mutex_unlock(&mut2);
  47.         pthread_join(thread, NULL);
  48.         printf("A: Ho completato la join.\n\n\n");
  49.         pthread_mutex_unlock(&mut1);
  50.         //fine while
  51.     }
  52.     //7b. se rifiuta, si chiude l'esecuzione del secondo thread con la join e poi del primo
  53.    
  54.     //pulizia
  55.     pthread_mutex_destroy(&mut1);
  56.     pthread_mutex_destroy(&mut2);
  57.    
  58.     exit(EXIT_SUCCESS);
  59. }
  60.  
  61. void * gestore_thread(void * argomento){
  62.     //3. parte il secondo thread e tira un dado
  63.     pthread_mutex_lock(&mut2);
  64.     printf("\nB: Eccomi, sono il secondo thread. Mi e' giunta voce che ti e' uscito %d.\n", (int)argomento);
  65.     int num2 = rand() % FACCE + 1;
  66.     printf("B: A me, invece, e' uscito %d.\n", num2);
  67.     //4. confronta il risultato con quello del primo e decreta il vincitore
  68.     if ((int)argomento > num2)
  69.         printf("B: Questo significa che ho perso!\n");
  70.     else if ((int)argomento < num2)
  71.         printf("B: Questo significa che ho vinto!\n");
  72.     else
  73.         printf("B: Questo significa che abbiamo pareggiato...\n");
  74.     //5. chiede al primo thread se vuole giocare ancora. si blocca
  75.     printf("\nB: Vuoi giocare ancora, thread A?\n");
  76.     pthread_mutex_unlock(&mut1);
  77.     pthread_mutex_lock(&mut2);
  78.     //8. il thread controlla il valore di run e fa la join
  79.     printf("\n\nB: Sono sveglio. Hai scelto %d.. In ogni caso adesso faccio la exit.\n", run);
  80.     pthread_mutex_unlock(&mut2);
  81.     pthread_exit(NULL);
  82. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement