Discusión:Mecanismos de sincronización

De Wiki de Sistemas Operativos
Saltar a: navegación, buscar

- A mi enteder en el fragmento de codigo de :

int compartida = 1, tmp;
retry:
        tmp = compartida;        /* almaceno el valor de la variable compartida en una temporal. */
        tmp++;                   /* actualizo la varible temporal. */
        if (compartida+1 != tmp) /* compruebo si la variable compartida ha sido modificada */
            goto retry;          /* mientras operaba con la variable temporal. */

¿no deberia en vez de modificar la variable temporal , modificar la variable compartida?

Ya que como dice al principio los dos procesos tienen el mismo codigo entonces, en ambos la variable compartida no es modificada, se modifica la variable temporal.

Ejemplo: El proceso A empieza a ejecutarse y se queda en la linea tmp ++ por que agota su ventana de tiempo, el proceso B empieza a ejecutar, y tmb se queda en estado preparado por que agota su ventana de tiempo en la instruccion tmp ++, en este caso ambos procesos han acedido al recurso comportido y la instruccion if la cumple.

¿Que os parece?



Ese trozo de código es incompleto a mi parecer. ¿Lo que dices es esto?

int compartida = 1, tmp;
retry:
        tmp = compartida;        /* almaceno el valor de la variable compartida en una temporal. */
        '''compartida++''';                   /* actualizo la varible */
        if (compartida != '''tmp + 1''') /* compruebo si la variable compartida ha sido modificada */
            goto retry;          /* mientras operaba con la variable temporal. */

No creo que actualizar la variable compartida antes de hacer ninguna comprobación sea correcto.

Pienso que seria mejor actualizar el valor de la variable una vez hecha la comprobación:

int compartida = 1, tmp;
retry:
        tmp = compartida;        /* almaceno el valor de la variable compartida en una temporal. */
        tmp++;                   /* actualizo la varible temporal. */
        if (compartida+1 != tmp) /* compruebo si la variable compartida ha sido modificada */
            goto retry;          /* mientras operaba con la variable temporal. */
        '''else
            compartida = tmp;''' /* Actualizo el valor de la variable compartida. */

Lo más probable es que la intención de ese trozo fuese mostrar la idea principal, por eso no aparece la modificación de la variable compartida. Pero tampoco estoy seguro de esto. ¿Alguna otra opinión?


Lo del comentario anterior es cierto excepto lo siguiente, que no tiene sentido:

int compartida = 1, tmp;

¿Está asignando dos valores a la misma variable? Aparte de ésto, creo que tal y como está planteado el ejemplo debería ser como sigue:

int compartida = 1;              //Inicialización, puesta de manera ilustrativa pero irrelevante su valor y cuando se hace
/* Código no concurrente */
//...
/* Modificación de variable compartida, código concurrente */
{       
        int tmp;                 //Limitamos la existencia de la variable temporal con las llaves
        retry:                   //GOTO y etiqueta fuera sin for, si lo viera algún talibán de C...
        tmp = compartida;        /* almaceno el valor de la variable compartida en una temporal. */
        tmp++;                   /* actualizo la varible temporal. */
        if (compartida+1 != tmp) /* compruebo si la variable compartida ha sido modificada */
            goto retry;          /* mientras operaba con la variable temporal. */
        else
            compartida = tmp;    //Esto es chungo, porque aunque sea verdad el código del if nada 
}                                //garantiza que la variable compartida no cambie mientras se llega al 
                                 //else

De todas maneras, por lo que he puesto en el último comentario, el ejemplo creo que tampoco es bueno. Al final, la operación de comprobación exige un bloque sincronizado que englobe al if-else, paradigma de las técnicas no optimistas