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);
}
}
-----------------------------------------------------------------