2011-10-14 18 views
8

Digamos que tiene el código¿Por qué necesita un bucle while a la espera de una variable de condición

pthread_mutex_lock(&cam->video_lock); 
while(cam->status == WAIT_DISPLAY) // <-- Why is this a 'while' and not an 'if'? 
    pthread_cond_wait(&cam->video_cond, &cam->video_lock); 
pthread_mutex_unlock(&cam->video_lock); 

Mi pregunta es, ¿por qué necesita un bucle while aquí. ¿No pthread_cond_wait simplemente espere hasta que el hilo de señalización indique cam_video_cond? OK, sé que podría tener un caso en el que cam-> Estado no es igual a WAIT_DISPAY cuando pthread_cond_wait se llama, pero en ese caso sólo podría comprobar a través de una condición si en lugar de utilizar mientras .

¿Falta algo aquí? Mi comprensión de pthread_cond_wait es que solo espera infinito si cam_video_cond no se señaliza. Además, desbloquea el mutex cam_video_lock cuando se llama, pero cuando se señala la condición, antes de volver, se vuelve a bloquear cam_video_lock. ¿Estoy en lo cierto?

+0

La misma pregunta aquí, http://www.unix.com/programming/149791-condition-variables.html – MetallicPriest

+0

[Despertar falso] (http://en.wikipedia.org/wiki/Spurious_wakeup) –

Respuesta

17

Se recomienda que todas las discusiones comprobar el estado después de regresar de pthread_cond_wait porque hay varias razones la condición podría no ser cierto. Una de estas razones es un despertar espurio; es decir, un hilo podría despertarse aunque ningún hilo haya indicado la condición .

Fuente: Spurious wakeup

2

Por razones de rendimiento, la API POSIX le permite al sistema operativo reactivar el hilo incluso si la condición no se ha cumplido (es decir, spurious wakeup).

9

activaciones espurias son una de las razones, pero el encendido del legítimos, pero ajenos son otra.

considerar:

  1. se pone un trabajo en una cola.

  2. Usted señal de la variable de estado, despertando hilo A.

  3. Se pone un trabajo en una cola.

  4. Usted señal de la variable de estado, despertando hilo B.

  5. Tema Una entrada es programada, ¿el primer trabajo.

  6. El subproceso A encuentra la cola no vacía y realiza el segundo trabajo.

  7. El subproceso B se programa después de haberlo despertado, pero encuentra que la cola todavía está vacía.

Cuestiones relacionadas