Advertisement
Guest User

Untitled

a guest
May 24th, 2017
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.41 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4. #include <pthread.h>
  5.  
  6. #define Nmax 4
  7. #define Pmax 3
  8. pthread_mutex_t llave[Nmax];
  9.  
  10. // Solucion:    Eliminación de la condicion de espera circular.
  11. //      Cada hilo solo tiene permitido poseer un recurso como maximo.
  12.  
  13. void *trabajo(void *tid){
  14.  
  15.     int thid, i, j, k, ya;
  16.     double x=0;
  17.     int mis_recursos[Nmax];
  18.  
  19.     thid = (int)tid;
  20.     srand(thid);
  21.     for(i=0;i<Nmax;i++){
  22.         ya=0;
  23.         while(ya==0){
  24.             j=(int) (Nmax)*(rand()/(RAND_MAX+1.0));
  25.             ya=1;
  26.             for(k=0;k<i;k++){
  27.                 if (mis_recursos[k]==j){
  28.                     ya=0;
  29.                 }
  30.             }
  31.         }
  32.         mis_recursos[i]=j;
  33.         printf("Soy %d y quiero el recurso %d\n",thid,j);
  34.         pthread_mutex_lock(&llave[j]);
  35.         for(k=0;k<10000;k++){
  36.             x+=sqrt(sqrt(k+0.1));
  37.         }
  38.         k = (int) 2*(rand()/(RAND_MAX+1.0));
  39.         sleep(k);
  40.         printf("    Soy %d y tengo el recurso %d\n",thid,j);
  41.         pthread_mutex_unlock(&llave[j]);
  42.     }
  43.     printf("**********ACABE! Soy %d\n",thid);
  44.  
  45. }
  46.  
  47. main(){
  48.  
  49.     int i, j;
  50.     pthread_t th[Pmax];
  51.  
  52.     for(i=0;i<Nmax;i++){
  53.         pthread_mutex_destroy(&llave[i]);
  54.     }
  55.     for(i=0;i<Nmax;i++){
  56.         pthread_mutex_init(&llave[i],NULL);
  57.     }
  58.     for(i=0;i<Pmax;i++){
  59.         j = pthread_create(&th[i],NULL,trabajo,(void *)i);
  60.         if(j){
  61.             printf("ERROR; return code from pthread_creat() is %d\n",j);
  62.             exit(-1);
  63.         }
  64.     }
  65.     for(i=0;i<Pmax;i++){
  66.         pthread_join(th[i],NULL);
  67.     }
  68.     for(i=0;i<Nmax;i++){
  69.         pthread_mutex_destroy(&llave[i]);
  70.     }
  71.  
  72.     exit(0);
  73.  
  74. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement