Solución (b y c)


Para probar b) y c), observemos que al proceso Padre se le puede impedir entrar en la sección crítica solamente si permanece atrapado en el bucle while con la condición 'c2=True' y 'Turno=2'; éste es el único bucle. Si el proceso Hijo no está interesado en entrar en la sección crítica, entonces 'c2=False' y el proceso Padre puede entrar en su sección crítica. Si el proceso Hijo ha fijado 'c2=True' y también está ejecutando su instrucción while entonces, o bien 'Turno=1' o bien 'Turno=2'.

Si 'Turno=1', el proceso Padre entrará en su sección crítica. Si 'Turno=2', el proceso Hijo entrará en la sección crítica. No obstante, una vez que el proceso Hijo salga de su sección crítica, restaurará la variable 'c2' a 'False', permitiendo al proceso Padre entrar en su sección crítica. Si el proceso hijo tuviera que restaurar su variable 'c2' a 'True', también tendrá que fijar 'Turno=1'. Así, puesto que el proceso Padre no cambia el valor de la variable 'Turno' mientras está ejecutando la instrucción while, el proceso Padre entrará en la sección crítica (progresión) como máximo una entrada después que el proceso Hijo (espera limitada).

 if (0!=fork()) {                               /* Proceso Padre */

      int i;
      fprintf(fsal,"P1: SOY EL PROCESO PADRE\n"); 

      for (i=0; i<nIteraciones; i++){

         *c1='T';                                /* Seccion */
         *turno=2;                                     /*  de  */
         while (((*c2)=='T') && ((*turno)==2));           /*  entrada */

         incrementa(recurso, -5);                          /* Seccion */
         fprintf(fsal,"P1: recurso[%d]=%d\n", i, *recurso);       /* critica */

         *c1='F';    /* Seccion de salida */ 

      }/* fin del for */
volver atrás