source: trunk/guardiano.c@ 26

Last change on this file since 26 was 25, checked in by Mattia Monga, 11 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.