/* * Implementação com bug de mutex locks e variáveis de condição * utilizando semáforos. */ #include #include #include #include "mutex_bug.h" int mutex_init(mutex_t *lock, mutexattr_t* attr) { return sem_init(&lock->sem, 0, 1); } int mutex_destroy(mutex_t *lock) { return sem_destroy(&lock->sem); } int mutex_lock(mutex_t *lock) { return sem_wait(&lock->sem); } int mutex_unlock(mutex_t *lock) { return sem_post(&lock->sem); } /*------------------------------------------------------*/ int cond_init(cond_t *cond, condattr_t* attr) { mutex_init(&cond->lock, NULL); sem_init(&cond->sem, 0, 0); cond->n_wait = 0; return 0; } int cond_destroy(cond_t *cond) { mutex_destroy(&cond->lock); sem_destroy(&cond->sem); return 0; } int v = 0; int cond_wait(cond_t *cond, mutex_t *mutex_externo) { mutex_lock(&cond->lock); cond->n_wait++; mutex_unlock(&cond->lock); mutex_unlock(mutex_externo); if (v == 0) { v = 1; printf("Vai dormir\n"); sleep(3); } sem_wait(&cond->sem); mutex_lock(mutex_externo); return 0; } int cond_signal(cond_t *cond){ mutex_lock(&cond->lock); if (cond->n_wait > 0) { cond->n_wait--; sem_post(&cond->sem); } mutex_unlock(&cond->lock); return 0; } int cond_broadcast(cond_t *cond){ mutex_lock(&cond->lock); while (cond->n_wait > 0) { cond->n_wait--; sem_post(&cond->sem); } mutex_unlock(&cond->lock); return 0; }