Solución (a)


Para que el proceso Padre entre en su sección crítica la variable' c1 'debe valer 'False' o bien la variable 'Turno' vale 1.

Si el proceso Padre y el proceso Hijo pudieran ejecutar en sus secciones críticas al mismo tiempo, entonces 'c1=c2=True'.

Estas dos observaciones implican que el proceso Padre y el proceso Hijo no podrían haber ejecutado con éxito sus instrucciones while aproximadamente al mismo tiempo, puesto que el valor de Turno puede ser 1 ó 2, pero no ambos. De aquí, que uno de los procesos tiene que haber ejecutado con éxito la instrucción while mientras que el otro proceso tendría que ejecutar al menos, una instrucción ' Turno= 2' ( proceso Padre) más. No obstante, puesto que en este momento
'c2= True' y 'Turno=1', y puesto que esto persistirá mientras el proceso Hijo se encuentre en su sección crítica, el resultado es que la exclusión mutua queda preservada ( de igual forma para el proceso Hijo).

      *c1='F';
      *c2='F';

   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