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

#define P sem_wait
#define V sem_post
#define N 12

sem_t semaphore;

static void *reveilleur (void *p_data)
{
    // a chaque fois qu'on rentre dans le thread on incremente le semaphore
    // on sort du thread à la fin
    printf("Thread\n");
    V(&semaphore);
    return NULL;
}

static void *reveille (void *p_data)
{
    int i;
    printf("En attente\n");
    // Tant que tous les threads réveilleurs n'ont pas été appelés, on reste dans la boucle
    for(i = 0; i < N; i++)
        P(&semaphore);

    // on sort de la boucle on affiche que le thread vient de se réveiller
    printf("je suis reveille :)\n");
    return NULL;
}

int main()
{
    // Si le nombre de thread réveilleurs est inférieur ou égale au nombre de thread réveillé (soit 1)
    //on ferme le programme
    if(N <= 1)
        return 0;

    int i;
    pthread_t Re;
    pthread_t *R = NULL;

    // allocation des threads
    R = malloc(N * sizeof(pthread_t));

    // initialisation du semaphore à 0
    sem_init(&semaphore, 0, 0);

    // On crée les threads
    pthread_create(&Re, NULL, reveille, NULL);
    for(i = 0; i < N; i++)
        pthread_create(&R[i], NULL, reveilleur, NULL);

    getchar();
    return 0;
}
