nicb

Ese 2 Mutex

Aug 7th, 2018
112
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.71 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4. #include <pthread.h>
  5.  
  6. int glob=0;
  7. long somma=0;
  8. int finito=0;
  9. pthread_mutex_t mut1=PTHREAD_MUTEX_INITIALIZER;
  10. pthread_mutex_t mut2=PTHREAD_MUTEX_INITIALIZER;
  11. pthread_mutex_t mut3=PTHREAD_MUTEX_INITIALIZER;
  12. pthread_cond_t cond_controllo=PTHREAD_COND_INITIALIZER;
  13. pthread_cond_t cond_fine=PTHREAD_COND_INITIALIZER;
  14. void *genera ()
  15. {
  16.     int i;
  17.     for(i=0;i<1000;i++)
  18.     {
  19.         pthread_mutex_lock(&mut1);
  20.         glob++;
  21.         somma+=i;
  22.         printf("\nValore di glob = %d",glob);
  23.         pthread_cond_signal(&cond_controllo);
  24.         pthread_mutex_unlock(&mut1);       
  25.         pthread_mutex_lock(&mut2);
  26.             if(finito==1)
  27.             {
  28.                 pthread_mutex_unlock(&mut2);
  29.                 pthread_exit(0);
  30.             }
  31.         pthread_mutex_unlock(&mut2);
  32.        
  33.     }
  34. }
  35. void *controlla(void *arg)
  36. {
  37.     int *n_ptr=(int *)arg;
  38.     int n=*n_ptr;
  39.     while(1)
  40.     {  
  41.     pthread_mutex_lock(&mut2);
  42.     pthread_cond_wait(&cond_controllo,&mut2);
  43.     pthread_mutex_unlock(&mut2);
  44.     pthread_mutex_lock(&mut1);
  45.     pthread_mutex_lock(&mut2);
  46.     printf("\nSONO PASSATO!!\n");
  47.     if(glob>=n)
  48.         {
  49.             finito=1;
  50.             pthread_mutex_unlock(&mut1);
  51.             pthread_mutex_unlock(&mut2);
  52.             pthread_cond_signal(&cond_fine);
  53.             pthread_exit(0);
  54.            
  55.         }
  56.     pthread_mutex_unlock(&mut1);
  57.     pthread_mutex_unlock(&mut2);
  58.     }
  59.    
  60. }
  61.  
  62. int main(int argc,char **argv)
  63. {
  64.     int i,n=atoi(argv[1]);
  65.     ///Creo i 3 Thread
  66.     pthread_t t1,t2,t3;
  67.     pthread_create(&t1,NULL,genera,NULL);
  68.     pthread_create(&t2,NULL,genera,NULL);
  69.     pthread_create(&t3,NULL,controlla,&n);
  70.     pthread_mutex_lock(&mut3);
  71.     pthread_cond_wait(&cond_fine,&mut3);
  72.     pthread_mutex_unlock(&mut3);
  73.     pthread_join(t1,NULL);
  74.     pthread_join(t2,NULL);
  75.     pthread_join(t3,NULL);
  76.     printf("\nValore di glob = %d, limite = %d",glob,n);
  77. }
Add Comment
Please, Sign In to add comment