#include <iostream>
#include <semaphore.h>
#include <fstream>
#include <pthread.h>

#define P sem_post
#define V sem_wait


using namespace std;

sem_t case_vide;
sem_t case_pleine;

void* lire(void* data);
void* ecrire(void* data);
int buffer[5];
int iDepot;
int iExtrait;

void* lire(void* data)
{
    for(int i = 0; i < 10; i++)
    {
        P(&case_pleine);
        {
            cout << "lu: " << buffer[iExtrait] << endl;
            iExtrait ++;
            iExtrait %= 5;
            sleep(0.7);
        }

        V(&case_vide);
    }
}

void* ecrire(void* data)
{
    for(int i = 0; i < 10; i++)
    {
        P(&case_vide);
        {
            cout << "Ecris" << endl;
            buffer[iDepot] = iDepot;
            iDepot ++;
            iDepot %= 5;
            sleep(0.5);
        }
        V(&case_pleine);
    }
}

int main()
{
    //Variables
    char a;
    iDepot = 0;
    iExtrait = 0;

    //Gestion des threads
    pthread_t thr_lire;
    pthread_t thr_ecrire;
    sem_init(&case_vide, 5, 0);
    sem_init(&case_pleine,0, 5);

    pthread_create(&thr_ecrire, NULL, ecrire, NULL);
    pthread_create(&thr_lire, NULL, lire, NULL);

    cin >> a;
    return 0;
}
