Difference between revisions of "Esperimenti con semafori e monitor in C"
(Created page with "Ho messo a vostra disposizione alcuni sorgenti che implementano in C le astrazioni di semafro e monitor come le abbiamo viste (o vedremo presto) a lezione. Ho messo il materi...") |
|||
Line 29: | Line 29: | ||
semaphore_P(mutex); | semaphore_P(mutex); | ||
semaphore_V(mutex); | semaphore_V(mutex); | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | |||
+ | == produttore e consumatore == | ||
+ | |||
+ | Il file ''prod_cons.c'' implementa una soluzione del problemadel produttore/consumatore. | ||
+ | |||
+ | Il buffer e i semafori sono definiti come variabili condivise. | ||
+ | <syntaxhighlight lang=C> | ||
+ | semaphore full; | ||
+ | semaphore empty; | ||
+ | volatile int buffer; | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | Il main inizializza i semafori e crea i thread. | ||
+ | <syntaxhighlight lang=C> | ||
+ | int main(int argc, char *argv[]) { | ||
+ | pthread_t prod_t; | ||
+ | pthread_t cons_t; | ||
+ | full=semaphore_create(0); | ||
+ | empty=semaphore_create(1); | ||
+ | |||
+ | pthread_create(&prod_t, NULL, producer, NULL); | ||
+ | pthread_create(&cons_t, NULL, consumer, NULL); | ||
+ | pthread_join(prod_t, NULL); | ||
+ | pthread_join(cons_t, NULL); | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | La sincronizzazione fra produttore e il consumatore viene realizzata come segue: | ||
+ | <syntaxhighlight lang=C> | ||
+ | void *producer(void *arg) { | ||
+ | while (1) { | ||
+ | int value; | ||
+ | // produce value | ||
+ | semaphore_P(empty); | ||
+ | buffer = value; | ||
+ | semaphore_V(full); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | void *consumer(void *arg) { | ||
+ | while (1) { | ||
+ | int value; | ||
+ | semaphore_P(full); | ||
+ | value = buffer; | ||
+ | semaphore_V(empty); | ||
+ | // consume value | ||
+ | } | ||
+ | } | ||
</syntaxhighlight> | </syntaxhighlight> |
Revision as of 11:20, 26 October 2016
Ho messo a vostra disposizione alcuni sorgenti che implementano in C le astrazioni di semafro e monitor come le abbiamo viste (o vedremo presto) a lezione.
Ho messo il materiale in questo file.
La directory comprende:
- un Makefile
- tlist.[ch] un modulo di implementazione di liste circolari di thread_id (usate per gestire i processi bloccati). Le liste possono essere usate come code o stack.
- suspend.[ch] è il modulo che implementa la sospensione e riattivazione dei pthread (usando il segnale SIGUSR1).
- semaphore.[ch] implementazione dei semafori fair
- monitor.[ch] implementazione dei monitor (con semantica signal urgent per le variabili di condizione).
- prod_cons.c esempio: produttore consumatore con i semafori
- bounded_buf.c esempio: bounded_buffer con i semafori
- bounded_buf_mon.c esempio: bounded buffer con i monitor
- philo.c: cena dei filosofi (la soluzione è volutamente errata e può generare deadlock
uso dei semafori
Se volete fare altri esperimenti con i semafori dovete includere il file semaphore.h nei vostri sorgenti C.
Un semaforo ha tipo semaphore e viene creato in questo modo
semaphore mutex;
mutex = mutex_create(1);
(ovviamente le variabili semaphore devono essere condivise e 1 è solo l'esempio di valore iniziale per un semaforo mutex)
Le operazioni P e V su mutex si scrivono così:
semaphore_P(mutex);
semaphore_V(mutex);
produttore e consumatore
Il file prod_cons.c implementa una soluzione del problemadel produttore/consumatore.
Il buffer e i semafori sono definiti come variabili condivise.
semaphore full;
semaphore empty;
volatile int buffer;
Il main inizializza i semafori e crea i thread.
int main(int argc, char *argv[]) {
pthread_t prod_t;
pthread_t cons_t;
full=semaphore_create(0);
empty=semaphore_create(1);
pthread_create(&prod_t, NULL, producer, NULL);
pthread_create(&cons_t, NULL, consumer, NULL);
pthread_join(prod_t, NULL);
pthread_join(cons_t, NULL);
}
La sincronizzazione fra produttore e il consumatore viene realizzata come segue:
void *producer(void *arg) {
while (1) {
int value;
// produce value
semaphore_P(empty);
buffer = value;
semaphore_V(full);
}
}
void *consumer(void *arg) {
while (1) {
int value;
semaphore_P(full);
value = buffer;
semaphore_V(empty);
// consume value
}
}