2011-06-01 19 views
9

El libro Programming Interface Condición Linux tiene una pieza de código (productor/consumidor) para mostrar cómo funciona la variable de condición:Cómo utilizar variable

static pthread_mutex_t mtx = PTHREAD_MUTEX_INITIALIZER; 
static pthread_cond_t cond = PTHREAD_COND_INITIALIZER; 

static int avail = 0; 

while (TRUE) { 
    s = pthread_mutex_lock(&mtx); 

    while (avail == 0) { /* Wait for something to consume */ 
     s = pthread_cond_wait(&cond, &mtx); 
    } 

    while (avail > 0) { /* Consume all available units */ 
     avail--; 
    } 

    s = pthread_mutex_unlock(&mtx); 
} 

por las que utilizamos en pthread_mutex_lockwhile? ¿Por qué no lo usamos en un if?

Respuesta

12

Porque pthread_cond_signal() puede despertar más de un subproceso que espera en la variable de condición. Por lo tanto, debe verificar la condición una vez que se despierte, porque es posible que algún otro subproceso se haya despertado y lo haya cambiado antes que usted.

Si sabe que solo tiene un hilo en espera, y está seguro de que en el futuro nadie va a modificar el código en ningún otro lugar del programa para agregar otro hilo en espera, puede usar if. Pero nunca se sabe con seguridad, así que siempre use while.

[Actualización]

Como ninjalj señala en un comentario, mi respuesta es incompleta por no hablar de "activaciones falsas". Por ejemplo, el estándar POSIX deja en claro que si el hilo en espera recibe una señal (por ejemplo, a través de kill()), pthread_cond_wait() puede devolver 0 incluso si ningún otro hilo señalizó la variable de condición. El estándar es ambiguo (en mi opinión) en cuanto a si el hilo de espera puede ser reactivado sin ningún motivo ... Pero la línea de fondo es: Siempre use while, no if.

+6

Además, puede haber despertadores espurios, por lo que siempre use 'while'. – ninjalj

+0

¿Qué quieres decir con: wakeup espías –

+1

@Majid Azimi la variable de condición puede ser señalada sin motivo aparente, no solo porque alguien llamó a pthread_cond_signal/broadcast – nos

Cuestiones relacionadas