#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#define POC_HRACOV 5

int pocetPrecitanych = 0;
int genCislo = 0;
pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
pthread_t vlakna[POC_HRACOV];

void * server() 
{

  printf("Server generuje cislo ");
  genCislo = rand() % 20;
  printf("%d", genCislo);
  printf("\n");
  pthread_mutex_lock(&mut);
  pthread_cond_broadcast(&cond);  
  pthread_mutex_unlock(&mut);
  int pocetOpakovani = 0;
  while(1) 
{

    if (pocetPrecitanych == POC_HRACOV) {

      printf("vsetci hraci precitali.\n");
      pthread_mutex_lock(&mut);      
      pocetPrecitanych = 0;
      genCislo = rand() % 20;
      printf("genracia cisla %d ", genCislo);
      printf("\n");
      pthread_cond_broadcast(&cond);
      pthread_mutex_unlock(&mut);
      pocetOpakovani++;
      if (pocetOpakovani == 10) {

        break;
      }
    }
  }
}

void * hrac() {

  sleep(1);
  while(1) {

    printf("hrac cita %d", genCislo);
    printf(". ");
    pthread_mutex_lock(&mut);
    pocetPrecitanych++;  
    pthread_cond_wait(&cond, &mut);
    pthread_mutex_unlock(&mut);
  }
}

main(int argc, char *argv[]) {

  int i;
  pthread_create(&vlakna[5], NULL, &server, NULL);    
  for (i = 0; i < POC_HRACOV; i++) {

    pthread_create(&vlakna[i], NULL, &hrac, NULL);
  }  
  pthread_join(vlakna[5], NULL);   
  for (i = 0; i < POC_HRACOV; i++) {

    fflush(stdout);
    pthread_join(vlakna[i], NULL); 
 }  
  
  return 0;
}