Visibles a ambas hebras: pthread_mutex_t lock_de_mi_variable = PTHREAD_MUTEX_INITIALIZER; int variable = 0; En una hebra: : int done = 0; while (!done) { /*Espera activa u ocupada, indeseable */ pthread_ mutex_lock(&lock_de_mi_variable); if ( variable < MAXIMO) done=1; pthread_mutex_unlock(&lock_de_mi_variable); } /* hago lo que esperaba para variable < MAXIMO */ : | 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: : pthread_ mutex_lock(&lockDeMiVariable); while ( variable >= MAXIMO ) /* Debo seguir esperando mi condición !*/ pthread_cond_wait(&cambioDeVariable, &lockDeMiVariable); /*espero bloqueado*/ pthread_mutex_unlock(&lockDeMiVariable); /* hago lo que esperaba para variable < MAXIMO */ : | En Otra hebra: : pthread_ mutex_lock(&lockDeMiVariable); variable--; pthread_mutex_unlock(&lockDeMiVariable); pthread_cond_signal(&cambioDeVariable); : |
#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. |