// #include <iostream>
// #include <fstream>

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

#include <iostream>;
using namespace std;

#define LECTMAX 100
#define ECRIMAX 100
#define BUFFER 5

// using namespace std;

/*
// Création d'un thread
pthread_t thread;

// Prototype systmatique d'une fonction à placer dans un thread
void* ma_fonction(void* data);

// Exécution du thread
pthread_create(&thread, NULL, ma_fonction, (void*)&valeur);
// Pour le paramètre, il faut faire un cast au besoin !

// Renvoit 0 quand le thread est fini
int pthread_join(pthread_t thread, void **thread_return);

// Force la fin du thread courant
void pthread_exit(void *retval);
*/

void* lire(void* data);
void* ecrire(void* data);

// Sémaphores

sem_t plein;
sem_t vide;

int a;


void* lire(void* data)
{
		for (int i=0; i<LECTMAX; i++)
		{

				sem_wait(&plein);
				
   			cout << "Je suis en train de lire\n";
   			sem_getvalue(&plein,&a);
   			cout << a << " cases occupees apres lecture\n";
   			
   			sem_post(&vide);
   		
   		   	
   	}    	
}

void* ecrire(void* data)
{
		for (int j=0; j<ECRIMAX; j++)
		{
				sem_wait(&vide);
				
   			cout << "Je suis en train d'ecrire\n";
   			sem_getvalue(&vide,&a);
   			cout << BUFFER-a << " cases occupees apres ecriture\n";
   			
   			sem_post(&plein);
	
   	}   
}

int main()
{


	sem_init(&plein, 0, 0);
	sem_init(&vide, 0, BUFFER);
	
	
   pthread_t thr_lire;
   pthread_t thr_ecrire;
   // On associe le thread créé avec une fonction

   pthread_create(&thr_lire, NULL, lire, NULL);
   pthread_create(&thr_ecrire, NULL, ecrire, NULL);
   
   while (1)
   {  
  		pthread_join(thr_ecrire, NULL);pthread_join(thr_lire, NULL);			
   }
    return 0;
}
