[25] | 1 | /* Copyright (C) 2009 by Mattia Monga <mattia.monga@unimi.it> */
|
---|
| 2 | /* $Id$ */
|
---|
| 3 |
|
---|
| 4 | #include <unistd.h>
|
---|
| 5 | #include <stdio.h>
|
---|
| 6 | #include <stdlib.h>
|
---|
| 7 | #include <pthread.h>
|
---|
| 8 |
|
---|
| 9 | pthread_t p1,p2,p3;
|
---|
| 10 |
|
---|
| 11 | pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
|
---|
| 12 | pthread_cond_t dodici = PTHREAD_COND_INITIALIZER;
|
---|
| 13 | int contatore = 0;
|
---|
| 14 |
|
---|
| 15 |
|
---|
| 16 |
|
---|
| 17 | void* guardiano(void* x){
|
---|
| 18 | pthread_mutex_lock(&lock);
|
---|
| 19 | while ( contatore < 12){
|
---|
| 20 | printf("Going to block...........\n");
|
---|
| 21 | pthread_cond_wait(&dodici, &lock);
|
---|
| 22 | printf("Watcher alive...........\n");
|
---|
| 23 | }
|
---|
| 24 | pthread_mutex_unlock(&lock);
|
---|
| 25 | printf("Dodici!!!!!\n");
|
---|
| 26 | return NULL;
|
---|
| 27 | }
|
---|
| 28 |
|
---|
| 29 | // Il corpo del ciclo viene eseguito mantenendo il lock
|
---|
| 30 | void* incrementatore1(void* x){
|
---|
| 31 | while(pthread_mutex_lock(&lock), contatore < 12){
|
---|
| 32 | contatore += 1;
|
---|
| 33 | printf("Sono pippo e sto incrementando: %d\n ",
|
---|
| 34 | contatore);
|
---|
| 35 | if (contatore == 12) {
|
---|
| 36 | printf("Sveglia da pippo!!!!!\n");
|
---|
| 37 | pthread_cond_signal(&dodici);
|
---|
| 38 | }
|
---|
| 39 | pthread_mutex_unlock(&lock);
|
---|
| 40 | pthread_yield();
|
---|
| 41 | }
|
---|
| 42 | pthread_mutex_unlock(&lock);
|
---|
| 43 | return NULL;
|
---|
| 44 | }
|
---|
| 45 |
|
---|
| 46 | // come il precedente ma scritto con do-while forse e` piu` chiaro
|
---|
| 47 | void* incrementatore2(void* x){
|
---|
| 48 | do {
|
---|
| 49 | pthread_mutex_lock(&lock);
|
---|
| 50 | contatore += 1;
|
---|
| 51 | printf("Sono pluto e sto incrementando: %d\n ",
|
---|
| 52 | contatore);
|
---|
| 53 | if (contatore == 12){
|
---|
| 54 | printf("Sveglia da pluto!!!!!\n");
|
---|
| 55 | pthread_cond_signal(&dodici);
|
---|
| 56 | }
|
---|
| 57 | pthread_mutex_unlock(&lock);
|
---|
| 58 | pthread_yield();
|
---|
| 59 | } while (contatore < 12);
|
---|
| 60 | return NULL;
|
---|
| 61 | }
|
---|
| 62 |
|
---|
| 63 |
|
---|
| 64 |
|
---|
| 65 |
|
---|
| 66 | int main(void){
|
---|
| 67 |
|
---|
| 68 | pthread_create(&p1, NULL, incrementatore1, NULL);
|
---|
| 69 | pthread_create(&p2, NULL, incrementatore2, NULL);
|
---|
| 70 | pthread_create(&p3, NULL, guardiano, NULL);
|
---|
| 71 |
|
---|
| 72 | pthread_join(p1, NULL);
|
---|
| 73 | pthread_join(p2, NULL);
|
---|
| 74 | pthread_join(p3, NULL);
|
---|
| 75 |
|
---|
| 76 | return 0;
|
---|
| 77 | }
|
---|
| 78 |
|
---|
| 79 |
|
---|
| 80 |
|
---|
| 81 |
|
---|
| 82 |
|
---|
| 83 |
|
---|
| 84 |
|
---|
| 85 | /* Local Variables: */
|
---|
| 86 | /* compile-command: "make -k " */
|
---|
| 87 | /* End: */
|
---|