/*
 * Teste da função pthread_barrier_wait: múltiplas barreiras. 
 */

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

#define N_BARRIERS 2
#define N 10 /* N deve ser múltiplo de N_BARRIERS */

pthread_barrier_t barrier[N_BARRIERS];
volatile int c;

void *f_thread(void* v) {
  int id = (int) v;
  int i;

  for (i = 0; i < 2; i++) {
    int b = id % N_BARRIERS;
    sleep(random() % 3 + 1);
    printf("Thread %d vai entrar na barreira %d.\n", id, b);
    pthread_barrier_wait(&barrier[b]);
    printf("Thread %d passou pela barreira %d.\n", id, b);
  }
  return NULL;
}

int main() {
  pthread_t thr[N];
  int i = 0;

  srandom(time(NULL));
  for (i = 0; i < N_BARRIERS; i++){
    pthread_barrier_init(&barrier[i], NULL, N / N_BARRIERS);
  }
  for (i = 0; i < N; i++) 
    pthread_create(&thr[i], NULL, f_thread, (void*) i);

  pthread_exit(NULL);
}