E' un programma concorrente che crea atomi di idrogeno e ossigeno fino a formare una molecola di acqua H2O, ovviamente i processi H o i processi O che non servono per la creazione della molecola rimangono in attesa per poi essere risvegliati.
Usa i thread ed i mutex più le variabili di condizione sui thread, ma non i semafori classici, qualcuno saprebbe aiutarmi a capire questo codice??

UNA BREVE SINTESI DI COME FUNZIONA PER CAPIRLO MEGLIO.


----------------------------------------------------
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define NROFATOMS 50



pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
int hnr=0,onr=0;

int okay()
{
if (hnr >= 2 && onr >= 1)
return 1;
return 0;
}

void *H(void *i)
{
pthread_mutex_lock( &mutex );
int nr = *(int *)i;
hnr++;
printf("New H atom arrived. Nr H atom %d, nr O atom %d\n",hnr,onr);
pthread_cond_signal( &cond );

while (okay() == 0)
pthread_cond_wait( &cond,&mutex );

printf("H2O created\n");
if (hnr >= 2 && onr >= 1)
{
hnr = hnr - 2;
onr = onr - 1;
}
pthread_mutex_unlock( &mutex );
}

void *O(void *i)
{
pthread_mutex_lock( &mutex );
int nr = *(int *)i;

onr++;
printf("New O atom arriwed. Nr O atom %d, nr H atom %d\n",onr,hnr);
pthread_cond_signal( &cond );

while (okay() == 0)
pthread_cond_wait( &cond,&mutex );

printf("H2O created\n");
if (hnr >= 2 && onr >= 1)
{
hnr = hnr - 2;
onr = onr - 1;
}
pthread_mutex_unlock( &mutex );
}

main()
{
pthread_t th[NROFATOMS];
int i;
srand(time(NULL));

for (i=0; i< NROFATOMS; i++)
{
if (rand()%2==0)
{
pthread_create(&th[i],NULL,&H,&i);
}
else
{
pthread_create(&th[i],NULL,&O,&i);
}
}

for (i=0; i<NROFATOMS; i++)
{
pthread_join(th[i],NULL);
}
}
-----------------------------------------------------------------