2011-05-08 10 views
5

Si una variable que se está modificando en un hilo y está bloqueada y desbloqueada utilizando un mutex se lee en un ciclo while en otro hilo, ¿cómo se bloquea y desbloquea el mutex para que el ciclo While puede leer el valor, ¿es necesario?Manejando una variable mutex en una comprobación de ciclo while

Configuré una variable en un hilo y la controlé en otro hilo utilizando un ciclo while. ¿Cómo se bloquea y se desbloquea la variable para verificar el estado del ciclo while?

¿Es la única forma razonable de hacerlo, tener una variable adicional que se utiliza para ejecutar el ciclo while y establecerlo en el valor de la variable que necesita bloquear/desbloquear?

+0

El punto de un mutex es que * no * necesita un ciclo while. No es posible "bloquear una variable", solo es posible bloquear el código. Consigue un libro, el monstruo que se ensarta te comerá vivo. –

Respuesta

5

Editar: @ sugerencia de ninjalj para reemplazar el while -loop con el uso de una variable de estado es un buen consejo si está utilizando el while -loop a esperar hasta que un estado del programa ha sido alcanzado. Sin embargo, si está utilizando un -loop while a no trabajar hasta que un estado del programa se ha alcanzado entonces ...

Usted debe envolver el "lock-mutex; examine variable; unlock mutex" código de una función de utilidad, y su condición puede while -loop luego llama a esa función. Por ejemplo, la función de utilidad puede escribirse como se muestra en el siguiente código:

int valueOfSharedVariable() 
{ 
    int status; 
    int result; 

    status = pthread_mutex_lock(&mutex); 
    assert(status == 0); 
    result = sharedVariable; 
    status = pthread_mutex_unlock(&mutex); 
    assert(status == 0); 
    return result; 
} 

Entonces, su condición while -loop se puede escribir como la siguiente:

while (valueOfSharedVariable() < 10) { 
    ... 
} 
+0

¿Para qué se usa la afirmación? – jarryd

+3

La mayoría de las funciones pthread devuelven 0 si tienen éxito y algún tipo de código de error si fallan. La afirmación está ahí por si algo salió mal y no pudo adquirir o liberar el mutex correctamente. – Brendan

+1

Este 'assert()' prácticamente me salvó mi hiney, ¡porque me hizo darme cuenta de que no había inicializado correctamente mis mutexes! – MuffinTheMan

0

Debe bloquearlo durante la lectura, si existe la menor posibilidad de que alguien más esté escribiendo al mismo tiempo. De lo contrario, podrían ocurrir todo tipo de cosas, como que veas una actualización parcial o que no haya ninguna actualización.

Si utiliza el valor como una condición de bucle, y no se ven afectadas por las actualizaciones durante el bucle, hacer una copia y soltar el bloqueo podría ser una buena idea. Si se vería afectado por un cambio, deberá mantener el bloqueo, por supuesto.

4

Probablemente deberías usar una variable de condición. Ver pthread_cond_wait(3) y pthread_cond_signal(3)

Cuestiones relacionadas