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?


Esto no tieme ningún sentido:

int compartida = 1, tmp;

¿Está asignando dos valores a la misma variable?