Para citar la página del manual:¿Por qué pthread_cond_wait tiene activaciones espúreas?
Al utilizar variables de condición, siempre hay un predicado de Boole que involucra variables compartidas asociadas con cada condición de espera que es verdad si el hilo debe proceder. Pueden aparecer fallas espurias de las funciones pthread_cond_timedwait() o pthread_cond_wait(). Dado que el retorno de pthread_cond_timedwait() o pthread_cond_wait() no implica nada sobre el valor de este predicado, el predicado debe volver a evaluarse a partir de dicho retorno.
Por lo tanto, pthread_cond_wait
puede regresar aunque no lo haya indicado. A primera vista al menos, eso parece bastante atroz. Sería como una función que devuelve aleatoriamente el valor incorrecto o que se devuelve aleatoriamente antes de llegar realmente a una declaración de devolución adecuada. Parece un error importante. Pero el hecho de que eligieron documentar esto en la página del manual en lugar de corregirlo parece indicar que hay una razón legítima por la cual pthread_cond_wait
termina despertando de forma espuria. Presumiblemente, hay algo intrínseco sobre cómo funciona que lo hace para que eso no se pueda evitar. La pregunta es qué.
¿Por qué hace pthread_cond_wait
return spouriously? ¿Por qué no puede garantizarse que solo se va a activar cuando se haya indicado correctamente? ¿Alguien puede explicar la razón de su comportamiento espurio?
Me imagino que tiene algo que ver con regresar cada vez que el proceso capte una señal. La mayoría de * nixes no reinician una llamada de bloqueo después de que una señal lo interrumpe; simplemente establecen/devuelven un código de error que dice que se produjo una señal. – cHao
@cHao: aunque tenga en cuenta que debido a que las variables de condición tienen * otras * razones para despertar espurios de todos modos, manejar una señal no es un error para 'pthread_cond_ (timed) wait':" Si se envía una señal ... el hilo se reanuda la espera de la variable de condición como si no se hubiera interrumpido, o devolverá cero debido a activación espuria ". Otras funciones de bloqueo indican 'EINTR' cuando se interrumpe por una señal (por ejemplo' 'leer'), o se requiere que se reanuden (por ejemplo' pthread_mutex_lock'). Entonces, si no hubiera otros motivos para el despertar espurio, 'pthread_cond_wait' podría haberse definido como cualquiera de esos. –
Un artículo relacionado en Wikipedia: [Despertar falso] (http://en.wikipedia.org/wiki/Spurious_wakeup) – Palec