/* * Teste para o cond_wait: uma thread dorme no cond_wait, outra * executa cond_signal, mas uma terceira thread pega o lock antes * da primeira acordar. * Deixou de apresentar o problema em versões mais novas da * biblioteca... */ #include #include #include #include volatile int s = 0; pthread_cond_t cond; /* Para execução sem verificação de erros */ pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; void *thread_0(void* v) { pthread_mutex_lock(&mutex); printf("Thread 0 vai esperar... \n"); pthread_cond_wait(&cond, &mutex); printf("Thread 0 acordou... \n"); pthread_mutex_unlock(&mutex); return NULL; } void *thread_1(void* v) { pthread_mutex_lock(&mutex); printf("Thread 1 pegou o lock .. \n"); sleep(1); /* Deixa thread 2 entrar na fila para o lock... */ pthread_cond_signal(&cond); pthread_mutex_unlock(&mutex); return NULL; } void *thread_2(void* v) { printf("Thread 2 vai tentar pegar o lock... \n"); pthread_mutex_lock(&mutex); printf("Thread 2 pegou o lock... \n"); pthread_mutex_unlock(&mutex); return NULL; } int main() { pthread_t thr[3]; pthread_cond_init(&cond, NULL); pthread_create(&thr[0], NULL, thread_0, NULL); pthread_create(&thr[1], NULL, thread_1, NULL); pthread_create(&thr[2], NULL, thread_2, NULL); pthread_join(thr[0], NULL); pthread_join(thr[1], NULL); pthread_join(thr[2], NULL); return 0; }