pthread_cond_wait o pthread_cond_timedwait Subroutine

Finalidad

Bloquea la hebra de llamada en una condición.

Biblioteca

Biblioteca de hebras (libpthreads.a)

Sintaxis

#include <pthread.h>

int pthread_cond_wait (cond, mutex)
pthread_cond_t *cond;
pthread_mutex_t *mutex;

int pthread_cond_timedwait (cond, mutex, timeout)
pthread_cond_t *cond;
pthread_mutex_t *mutex;
const struct timespec *timeout;

Descripción

Las funciones pthread_cond_wait y pthread_cond_timedwait se utilizan para bloquear una variable de condición. Se les llama con mutex bloqueado por la hebra de llamada o se producirá un comportamiento no definido.

Estas funciones liberan atómicamente mutex y hacen que la hebra de llamada se bloquee en la variable de condición cond; atómicamente aquí significa atómicamente con respecto al acceso de otra hebra al mutex y, a continuación, a la variable de condición. Es decir, si otra hebra puede adquirir el mútex después de que la hebra de bloqueo lo libere, una llamada posterior a pthread_cond_signal o pthread_cond_broadcast en esa hebra se comporta como si se emitiera después de que la hebra de bloqueo se haya bloqueado.

Tras una devolución satisfactoria, el mútex se bloquea y es propiedad de la hebra de llamada.

Cuando se utilizan variables de condición, siempre hay un predicado booleano que implica una variable compartida que está asociada con cada espera de condición que es verdadera si la hebra debe continuar. Pueden producirse despertaciones falsas de las funciones pthread_cond_wait o pthread_cond_timedwait . Puesto que el retorno de pthread_cond_wait o pthread_cond_timedwait no implica nada sobre el valor de este predicado, el predicado debe volver a evaluarse tras dicho retorno.

El efecto de utilizar más de un mutex para operaciones pthread_cond_wait o pthread_cond_timedwait simultáneas en la misma variable de condición no está definido; es decir, una variable de condición se enlaza a un mutex exclusivo cuando una hebra espera en la variable de condición y este enlace (dinámico) finaliza cuando se devuelve la espera.

Una espera de condición (temporizada o no) es un punto de cancelación. Cuando el estado de habilitación de cancelabilidad de una hebra se establece en PTHREAD_CANCEL_DEFERRED, un efecto secundario de actuar sobre una solicitud de cancelación mientras se está en una condición de espera es que el mutex se vuelva a adquirir (en efecto) antes de llamar al primer manejador de limpieza de cancelación. El efecto es como si la hebra se hubiera desbloqueado, con permiso para ejecutarse hasta el punto de volver de la llamada a pthread_cond_wait o pthread_cond_timedwait, pero en ese momento se notifica la solicitud de cancelación y, en lugar de volver al interlocutor de pthread_cond_wait o pthread_cond_timedwait, inicia las actividades de cancelación de hebra, que incluyen llamar a los manejadores de limpieza de cancelación.

Una hebra que se desbloquea porque se cancela mientras está bloqueada en una llamada a pthread_cond_wait o pthread_cond_timedwait no consume ninguna señal de condición que se pueda dirigir simultáneamente a la variable de condición si hay otras hebras bloqueadas en la variable de condición.

La función pthread_cond_timedwait es la misma que pthread_cond_wait excepto que se devuelve un error si el tiempo absoluto especificado por timeout pasa (es decir, el tiempo del sistema es igual o superior a timeout) antes de que se señale o difunda la condición cond , o si el tiempo absoluto especificado por timeout ya se ha pasado en el momento de la llamada. Cuando se producen estos tiempos de espera excedidos, pthread_cond_timedwait libera el mutex y vuelve a adquirir el mutex referenciado por mutex. La función pthread_cond_timedwait también es un punto de cancelación. La hora absoluta especificada por tiempo de espera puede estar basada en el reloj en tiempo real del sistema o en el reloj monotónico del sistema. El reloj de referencia para la variable de condición se establece llamando a pthread_condattr_setclock antes de su inicialización con el objeto de atributos de condición correspondiente.

Si una señal es entregada a una hebra que está esperando una variable de condición, al regresar del manejador de señal la hebra reanuda la espera de la variable de condición como si no se interrumpiera, o devuelve cero debido a una activación espuria.

Parámetros

Elemento Descripción
cond Especifica la variable de condición a esperar.
Estado Especifica el mútex que se utiliza para proteger la variable de condición. El mútex debe estar bloqueado cuando se llama a la subrutina.
timeout Apunta a la estructura de tiempo absoluto que especifica el tiempo de espera de estado bloqueado.

Valores de retorno

Excepto si ETIMEDOUT, todas estas comprobaciones de error actúan como si se hubieran realizado inmediatamente al principio del proceso para la función y provocan un retorno de error, en vigor, antes de modificar el estado del mutex especificado por mutex o la variable de condición especificada por cond.

Al finalizar correctamente, se devuelve un valor de cero. De lo contrario, se devuelve un número de error para indicar el error.

Códigos de error

La función pthread_cond_timedwait falla si:

Elemento Descripción
ETIMEDOUT El tiempo especificado por timeout en pthread_cond_timedwait ha pasado.

Las subrutinas pthread_cond_wait y pthread_cond_timedwait fallan si se devuelven los siguientes códigos de error:

Elemento Descripción
EINVAL El valor especificado por cond, mutexo timeout no es válido.
EINVAL Se han proporcionado diferentes exclusiones mutuas para operaciones pthread_cond_wait o pthread_cond_timedwait simultáneas en la misma variable de condición.
EINVAL El mútex no era propiedad de la hebra actual en el momento de la llamada.
EPERM El mútex no era propiedad de la hebra actual en el momento de la llamada, XPG_SUS_ENV está establecido en ON y XPG_UNIX98 no está establecido.
ENOTRECOVERABLE El estado protegido del mútex no se puede recuperar.
EOWNERDEAD El mutex es un mutex robusto, y el proceso del hilo que posee el mutex terminado mientras que mantiene la cerradura del mutex.

Estas subrutinas no devuelven un código de error EINTR .