// hilos.cpp - Un programa C++ visto como un proceso con
//             múltiples hilos
#include <iostream>
#include <pthread.h>
using namespace std;

int random(int n)
{
  static bool primera_vez = true;
  if (primera_vez)
  {
    srand(time(0));
    primera_vez = false;
  }
  return (rand() % n)+1; // valor entre 1 y n
}

void esperar(int n)
{
  long tmi = clock() + n;
  while (clock() < tmi); // esperar n milisegundos
}

void tomarMuestraTipoA(int *n)
{
  *n = random(10);
  for (int i = 0; i < *n; i++)
  {
    cout << "Tomando muestra de tipo A\n";
    //esperar(500);
    Sleep(500);
  }
}

void tomarMuestraTipoB(int *n)
{
  *n = random(15);
  for (int i = 0; i < *n; i++)
  {
    cout << "Tomando muestra de tipo B\n";
    //esperar(500);
    Sleep(500);
  }
}

void resultados(int n, int m)
{
  cout << "Muestras de tipo A: " << n << endl;
  cout << "Muestras de tipo B: " << m << endl;
  cout << "Total: " << n + m << endl;
}

typedef void *(*ptrfnthr)(void *);

int main()
{
  int nMuestrasTipoA = 0;
  int nMuestrasTipoB = 0;
  
  // Identificadores de los hilos
  pthread_t hilo1, hilo2;
  // Crear los hilos 1 y 2
  pthread_create(&hilo1, 0,
                 (ptrfnthr)tomarMuestraTipoA,
                 (void *)&nMuestrasTipoA);
  pthread_create(&hilo2, 0,
                 (ptrfnthr)tomarMuestraTipoB,
                 (void *)&nMuestrasTipoB);
  // Esperar a que los hilos terminen
  pthread_join(hilo1, 0);
  pthread_join(hilo2, 0);
  // Mostrar resultados
  resultados(nMuestrasTipoA, nMuestrasTipoB);
  
  system("pause");
}

