// cond.c — esperar a que otro hilo avise, con una variable de condición.
//
// Uso: ./cond
// main crea un hilo que "prepara" un dato y avisa con pthread_cond_signal.
// main espera con pthread_cond_wait dentro de un while, con el mutex tomado.
#include <pthread.h>
#include <stdio.h>
#include <unistd.h>

static pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
static pthread_cond_t  ready_cv = PTHREAD_COND_INITIALIZER;
static int ready = 0;               // el estado que se espera (protegido por lock)
static int data = 0;

static void *producer(void *arg) {
    (void)arg;
    sleep(1);                       // simula trabajo
    pthread_mutex_lock(&lock);
    data = 42;
    ready = 1;                      // 1) cambiar el estado...
    pthread_cond_signal(&ready_cv); // 2) ...y avisar, con el mutex tomado
    pthread_mutex_unlock(&lock);
    return NULL;
}

int main(void) {
    pthread_t p;
    pthread_create(&p, NULL, producer, NULL);

    pthread_mutex_lock(&lock);
    while (!ready) {                // while, no if: se vuelve a verificar
        printf("main: esperando...\n");
        pthread_cond_wait(&ready_cv, &lock);  // suelta el lock y duerme
    }                               // al despertar, tiene el lock otra vez
    printf("main: listo, data = %d\n", data);
    pthread_mutex_unlock(&lock);

    pthread_join(p, NULL);
    return 0;
}
