source: trunk/guardiano.c @ 25

Last change on this file since 25 was 25, checked in by monga, 7 years ago

Concorrenza 2013

File size: 2.2 KB
Line 
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
9pthread_t p1,p2,p3;
10
11pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
12pthread_cond_t dodici = PTHREAD_COND_INITIALIZER;
13int contatore = 0;
14
15
16
17void* 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
30void* 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
47void* 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
66int 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: */
Note: See TracBrowser for help on using the repository browser.