Variables visibles a ambos hilos: pthread_mutex_t lock_de_mi_variable = PTHREAD_MUTEX_INITIALIZER; int variable = 0; En una hebra: /* Espera por un valor superior a LIMITE en variable */ : int deboEsperar = 1; while (deboEsperar) { /*Espera activa u ocupada, indeseable */ pthread_ mutex_lock(&lock_de_mi_variable); if ( variable > LIMITE) /* Alcanzó valor límite?*/ deboEsperar=0; pthread_mutex_unlock(&lock_de_mi_variable); } /* hago lo que esperaba cuando variable > LIMITE */ : |
En Otra hebra: : pthread_ mutex_lock(&lock_de_mi_variable); variable++; pthread_mutex_unlock(&lock_de_mi_variable); : |
#include <pthread.h> int pthread_cond_init(pthread_cond_t *restrict cond, pthread_condattr_t *restrict attr); int pthread_cond_destroy(pthread_cond_t *restrict cond); Ambas retornan 0 si es OK, y un número de error en caso de falla. |
#include <pthread.h> int pthread_cond_wait(pthread_cond_t *restrict cond, pthread_mutex_t *restrict mutex); int pthread_cond_timewait(pthread_cond_t *restrict cond, pthread_mutex_t *restrict mutex, const struct timespec *restrict timeout); Ambas retornan 0 si es OK, y un número de error en caso de falla. |
Visibles a ambas hebras: pthread_mutex_t lockDeMiVariable = PTHREAD_MUTEX_INITIALIZER; pthread_cond_t cambioDeVariable = PTHREAD_COND_INITIALIZER; int variable = 0; En una hebra: /* Espera por un valor superior a LIMITE en variable para poder proseguir */ : int deboEsperar = 1; pthread_ mutex_lock(&lock_de_mi_variable); while (deboEsperar) { /*Espera por condición */ if ( variable > LIMITE) /* Alcanzó valor límite?*/ deboEsperar=0; else pthread_cond_wait(&cambioDeVariable, &lockDeMiVariable); /*espera bloqueada*/ } pthread_mutex_unlock(&lock_de_mi_variable); /* hago lo que esperaba cuando variable > LIMITE */ |
En Otra hebra: : pthread_ mutex_lock(&lockDeMiVariable); variable++; pthread_mutex_unlock(&lockDeMiVariable); pthread_cond_signal(&cambioDeVariable); : |
Alternativamente esta hebra se pudo programar así (más simple): : pthread_ mutex_lock(&lockDeMiVariable); while ( variable <= LIMITE ) /* Debo seguir esperando mi condición !*/ pthread_cond_wait(&cambioDeVariable, &lockDeMiVariable);/*espera bloqueada*/ pthread_mutex_unlock(&lockDeMiVariable); /* hago lo que esperaba para variable > LIMITE */ : |
#include <pthread.h> int pthread_cond_signal(pthread_cond_t *restrict cond); int pthread_cond_broadcast(pthread_cond_t *restrict cond); Ambas retornan 0 si es OK, y un número de error en caso de falla. |