#include <pthread.h>
#include <stdio.h>
#include <unistd.h>
#include <stdbool.h>

bool condition = false;
pthread_cond_t condv = PTHREAD_COND_INITIALIZER;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

void* worker_thread(void* arg) {

  pthread_mutex_lock(&mutex);
  while (!condition) {
    printf("ESPERANDO CONDICION (condition == TRUE)\n");
    pthread_cond_wait(&condv, &mutex);
  }
  pthread_mutex_unlock(&mutex);

  printf("La condición se ha cumplido, por lo que el hilo puede continuar.\n");

  return NULL;
}

int main() {
  pthread_t thread;

  // Vamos a manipular 'condition', usamos el mutex.
  pthread_mutex_lock(&mutex);
  // Inicializamos la condición a false.
  condition = false;
  pthread_mutex_unlock(&mutex);

  //printf("Creamos el hilo trabajador.\n");
  pthread_create(&thread, NULL, worker_thread, NULL);

  // Esperamos 1sg.
  sleep(1);
  // Y cumplimos la condición.
  // Vamos a manipular 'condition', usamos el mutex.
  pthread_mutex_lock(&mutex);
  condition = true;
  pthread_cond_signal(&condv);
  pthread_mutex_unlock(&mutex);


  // Esperamos a que el hilo trabajador termine.
  pthread_join(thread, NULL);

  return 0;
}
