Guest User

Untitled

a guest
Jun 24th, 2018
97
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 7.59 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <pthread.h>
  4. #include <unistd.h>
  5. #include <stdbool.h>
  6.  
  7.  
  8. #define THREAD 15
  9. #define MAX (THREAD/2)-2
  10.  
  11. pthread_cond_t impiegato1_cond = PTHREAD_COND_INITIALIZER;
  12. pthread_mutex_t impiegato1_mutex = PTHREAD_MUTEX_INITIALIZER;
  13. pthread_cond_t impiegato2_cond = PTHREAD_COND_INITIALIZER;
  14. pthread_mutex_t impiegato2_mutex = PTHREAD_MUTEX_INITIALIZER;
  15. pthread_cond_t fila1_cond = PTHREAD_COND_INITIALIZER;
  16. pthread_mutex_t mutex_abitanti_in_fila1 = PTHREAD_MUTEX_INITIALIZER;
  17. pthread_cond_t fila2_cond = PTHREAD_COND_INITIALIZER;
  18. pthread_mutex_t mutex_abitanti_in_fila2 = PTHREAD_MUTEX_INITIALIZER;
  19. pthread_mutex_t fila1_mutex = PTHREAD_MUTEX_INITIALIZER;
  20. pthread_mutex_t fila2_mutex = PTHREAD_MUTEX_INITIALIZER;
  21. pthread_cond_t responsabile_cond = PTHREAD_COND_INITIALIZER;
  22. pthread_mutex_t responsabile_mutex = PTHREAD_MUTEX_INITIALIZER;
  23. pthread_mutex_t primo_posto_fila1 = PTHREAD_MUTEX_INITIALIZER;
  24. pthread_mutex_t primo_posto_fila2 = PTHREAD_MUTEX_INITIALIZER;
  25. pthread_mutex_t rimanenti1_mutex = PTHREAD_MUTEX_INITIALIZER;
  26. pthread_mutex_t rimanenti2_mutex = PTHREAD_MUTEX_INITIALIZER;
  27.  
  28. void abitante (int id);
  29. void responsabile();
  30. void impiegato1();
  31. void impiegato2();
  32.  
  33. const int S=THREAD;
  34. int B1=MAX;
  35. int B2=MAX;
  36.  
  37. int abitanti_in_fila1=0;
  38. int abitanti_in_fila2=0;
  39. int rimanenti1=THREAD;
  40. int rimanenti2=THREAD;
  41. int test=1;
  42.  
  43. bool svegliato_da_impiegato1=false;
  44. bool svegliato_da_impiegato2=false;
  45.  
  46. void main()
  47. {
  48.  
  49.     int id;
  50.     pthread_t responsabile_t, *abitante_t, impiegato1_t, impiegato2_t;
  51.  
  52.     pthread_create( &responsabile_t, NULL, (void *) &responsabile, NULL);
  53.     pthread_create( &impiegato1_t, NULL, (void *) &impiegato1, NULL);
  54.     pthread_create( &impiegato2_t, NULL, (void *) &impiegato2, NULL);
  55.  
  56.     sleep(0.1);/*giusto per essere sicuri che gli abitanti siano creati DOPO impiegati e responsabile*/
  57.  
  58.     for(id=0;id<S;id++)
  59.     {
  60.         abitante_t = (pthread_t *) malloc(sizeof(pthread_t));
  61.         pthread_create(abitante_t, NULL, (void *) &abitante, (void *) (id+1));     
  62.     }
  63.     pthread_join(*abitante_t,NULL);
  64.  
  65.             return;
  66. }
  67.  
  68. void responsabile()
  69. {
  70.     printf("Responsabile creato\n");
  71.     pthread_cond_wait(&responsabile_cond, &responsabile_mutex);
  72.    
  73.     while(rimanenti1>0 || rimanenti2>0)
  74.     {
  75.         printf("Responsabile svegliato\n");
  76.        
  77.         if(svegliato_da_impiegato1 == true)
  78.         {
  79.             printf("Responsabile svegliato da impiegato 1\n");
  80.             B1=MAX;
  81.             printf("Responsabile rifornisce i b1\n");
  82.             pthread_cond_signal (&impiegato1_cond);
  83.             printf("Responsabile manda signal a impiegato1 e si rimette in wait\n");
  84.             svegliato_da_impiegato1=false;
  85.             pthread_cond_wait(&responsabile_cond, &responsabile_mutex);
  86.         }
  87.         if(svegliato_da_impiegato2 == true)
  88.         {
  89.             printf("Responsabile svegliato da impiegato 2\n");
  90.             B2=MAX;
  91.             printf("Responsabile rifornisce i b2\n");
  92.             pthread_cond_signal (&impiegato2_cond);
  93.             printf("Responsabile manda signal a impiegato2 e si rimette in wait\n");
  94.             svegliato_da_impiegato2=false;
  95.             pthread_cond_wait(&responsabile_cond, &responsabile_mutex);
  96.         }
  97.     }
  98. }
  99.  
  100. void impiegato1()
  101. {
  102.     printf("Impiegato1 creato\n");
  103.     pthread_cond_wait (&impiegato1_cond, &impiegato1_mutex);
  104.     printf("Impiegato1 svegliato\n");
  105.    
  106.    
  107.     while(rimanenti1>0 || rimanenti2>0)
  108.     {
  109.         pthread_mutex_lock(&primo_posto_fila1);
  110.         printf("Impiegato 1 all'inizio del while\n");
  111.         if(B1==0)
  112.         {
  113.             printf("Biglietti 1 finiti!!\n");
  114.             printf("Impiegato 1 blocca mutex responsabile\n");
  115.             pthread_mutex_lock(&responsabile_mutex);
  116.             svegliato_da_impiegato1=true;
  117.             printf("Impiegato 1 sveglia responsabile\n");
  118.             pthread_cond_signal(&responsabile_cond);
  119.             printf("Impiegato 1 si mette in attesa\n");
  120.             pthread_cond_wait(&impiegato1_cond, &impiegato1_mutex);
  121.             printf("Impiegato 1 svegliato da responsabile\n");
  122.         }
  123.        
  124.         printf("Impiegato 1 consegna biglietto\n");
  125.         B1--;
  126.         printf("Ora ci sono %d biglietti 1 rimasti\n",B1);
  127.         printf("Impiegato 1 manda signal a fila 1\n");
  128.         pthread_cond_signal(&fila1_cond);
  129.         pthread_mutex_unlock(&fila1_mutex);
  130.         printf("Impiegato 1 si mette in wait in attesa del prossimo abitante\n");
  131.         pthread_cond_wait(&impiegato1_cond, &primo_posto_fila1);
  132.         printf("Impiegato 1 esce dal wait\n");         
  133.     }
  134.     printf("Impiegato 1 distrutto\n");
  135.     pthread_exit(NULL);
  136. }
  137.  
  138. void impiegato2()
  139. {
  140.     printf("Impiegato2 creato\n");
  141.     pthread_cond_wait (&impiegato2_cond, &impiegato2_mutex);
  142.     printf("Impiegato2 svegliato\n");
  143.     while(rimanenti1>0 || rimanenti2>0)
  144.     {
  145.         printf("Impiegato 2 all'inizio del while\n");
  146.         if(B2==0)
  147.         {
  148.             printf("Biglietti 2 finiti!!\n");
  149.             printf("Impiegato 2 blocca mutex responsabile\n");
  150.             pthread_mutex_lock(&responsabile_mutex);
  151.             svegliato_da_impiegato2=true;
  152.             printf("Impiegato 2 sveglia responsabile\n");
  153.             pthread_cond_signal(&responsabile_cond);
  154.             printf("Impiegato 2 si mette in attesa\n");
  155.             pthread_cond_wait(&impiegato2_cond, &impiegato2_mutex);
  156.             printf("Impiegato 2 svegliato da responsabile\n");
  157.         }
  158.        
  159.         printf("Impiegato 2 consegna biglietto\n");
  160.         B2--;
  161.         printf("Ora ci sono %d biglietti 2 rimasti\n",B2);
  162.         printf("Impiegato 2 manda signal a fila 2\n");
  163.         pthread_cond_signal(&fila2_cond);
  164.         pthread_mutex_unlock(&fila2_mutex);
  165.         printf("Impiegato 2 si mette in wait in attesa del prossimo abitante\n");
  166.         pthread_cond_wait(&impiegato2_cond, &primo_posto_fila2);   
  167.         printf("Impiegato 2 esce dal wait\n");     
  168.     }
  169.     printf("Impiegato 2 distrutto\n");
  170.     pthread_exit(NULL);
  171. }
  172.  
  173. void abitante(int id)
  174. {
  175.     printf("Abitante %d creato\n",id);
  176.     int fila;
  177.     bool possiedo_biglietto1 = false;
  178.     bool possiedo_biglietto2 = false;
  179.    
  180.     /*Scelta della fila: l'abitante andrà nella fila con meno persone,
  181.      * o, in caso di parità, nella fila1*/
  182.      
  183.     if(abitanti_in_fila1<abitanti_in_fila2)
  184.     {
  185.         fila=1;
  186.         pthread_mutex_lock(&mutex_abitanti_in_fila1);
  187.         abitanti_in_fila1++;
  188.         pthread_mutex_unlock(&mutex_abitanti_in_fila1);
  189.         printf("Abitante %d in fila 1\n",id);
  190.     }
  191.     else
  192.     {
  193.         fila=2;
  194.         pthread_mutex_lock(&mutex_abitanti_in_fila2);
  195.         abitanti_in_fila2++;
  196.         pthread_mutex_unlock(&mutex_abitanti_in_fila2);
  197.         printf("Abitante %d in fila 2\n",id);
  198.     }
  199.    
  200.     while(possiedo_biglietto1==false || possiedo_biglietto2 == false)
  201.     {
  202.         if(fila==1)
  203.         {
  204.             printf("Abitante %d prova a bloccare mutex fila 1.\n",id);
  205.             //pthread_mutex_lock(&primo_posto_fila1);
  206.             printf("Abitante %d è riuscito a bloccare mutex fila 1\n",id);
  207.             printf("Abitante %d manda signal a impiegato 1\n",id);
  208.             pthread_cond_signal(&impiegato1_cond);
  209.             printf("Abitante %d mette in wait se stesso e la fila 1\n",id);
  210.             pthread_cond_wait(&fila1_cond,&fila1_mutex);
  211.             printf("Abitante %d è stato svegliato e ha il biglietto 1\n",id);
  212.            
  213.             pthread_mutex_unlock(&impiegato1_mutex);
  214.             possiedo_biglietto1=true;
  215.             pthread_mutex_lock(&rimanenti1_mutex);
  216.             rimanenti1--;
  217.             pthread_mutex_unlock(&rimanenti1_mutex);
  218.            
  219.             if(possiedo_biglietto2==false)
  220.             {
  221.                 printf("Abitante %d in fila 2\n",id);
  222.                 fila=2;
  223.             }
  224.         }
  225.        
  226.         if(fila==2)
  227.         {
  228.             printf("Abitante %d prova a bloccare mutex fila 2.\n",id);
  229.             pthread_mutex_lock(&primo_posto_fila2);
  230.             printf("Abitante %d è riuscito a bloccare mutex fila 2\n",id);
  231.             printf("Abitante %d manda signal a impiegato 2\n",id);
  232.             pthread_cond_signal(&impiegato2_cond);
  233.             printf("Abitante %d mette in wait se stesso e la fila 2\n",id);
  234.             pthread_cond_wait(&fila2_cond,&fila2_mutex);
  235.             printf("Abitante %d è stato svegliato e ha il biglietto 2\n",id);
  236.             pthread_mutex_unlock(&impiegato2_mutex);
  237.             possiedo_biglietto2=true;
  238.             pthread_mutex_lock(&rimanenti2_mutex);
  239.             rimanenti2--;
  240.             pthread_mutex_unlock(&rimanenti2_mutex);
  241.            
  242.             if(possiedo_biglietto1==false)
  243.             {
  244.                 printf("Abitante %d in fila 1\n",id);
  245.                 fila=1;
  246.             }
  247.            
  248.         }
  249.     }
  250.     printf("L'abitante %d ha tutti i biglietti!\n In tutto %d abitanti hanno tutti i biglietti\n",id,test);
  251.     test++;
  252.     printf("Abitante %d distrutto\n",id);
  253.     pthread_exit(NULL);
  254. }
Add Comment
Please, Sign In to add comment