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


pthread_mutex_t mutex;
pthread_cond_t cond;

void *do_work(void *arg);

int main(int argc, char *argv) {
  int counter;
  pthread_t worker_thread;
  pthread_attr_t attr;

  counter = 0;
  pthread_mutex_init(&mutex, NULL);
  pthread_cond_init(&cond, NULL);

  pthread_attr_init(&attr);
  pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED);

  if (pthread_create(&worker_thread, &attr, 
                     do_work, (void *)&counter)) {
    fprintf(stderr,"Error while creating thread\n");
    exit(1);
  }

  while(1) {
    pthread_mutex_lock(&mutex);
    counter++;
    pthread_mutex_unlock(&mutex);
    if (counter % 1234 == 0) {
      fprintf(stdout,"Parent: Awakening child - counter = %d\n",counter);
      pthread_cond_signal(&cond);
    }
    usleep(1000); 
  }
  exit(0); 
}

void *do_work(void *arg) {
  int *counter = (int*)arg;
 
  while(1) {
    pthread_mutex_lock(&mutex);
    pthread_cond_wait(&cond,&mutex);
    fprintf(stdout,"Child: awakened - counter = %d\n",*counter);
    pthread_mutex_unlock(&mutex);
  }
  return NULL;
}

