-
Notifications
You must be signed in to change notification settings - Fork 0
/
es6.c
136 lines (120 loc) · 3.2 KB
/
es6.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#include <semaphore.h>
#include <time.h>
#define DELAY 10000
#define TRIP_SIZE 20 //numero di posti prenotabili per il viaggio
#define OPERATORS 3 //numero di operatori nell'agenzia di viaggio
pthread_mutex_t db_lock = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_t op_lock = PTHREAD_MUTEX_INITIALIZER;
int seats=TRIP_SIZE;
int active_op;
pthread_t op[OPERATORS];
void *confirm_booking();
void *inizializza();
void *operatore();
void *wait_client();
int check_availability();
int ask_confirmation();
void *book_seat();
void main(int argc, char *args){
int k;
inizializza();
for(k=0;k<OPERATORS;k++){
pthread_join(op[k],NULL);
}
printf("Agenzia chiusa!\n");
}
//inizializza trip[] e op[]
void *inizializza(){
int j;
for (j=0;j<OPERATORS;j++){
pthread_create( &op[j],NULL,operatore,NULL );
}
}
void *operatore(){
while(1){
//generatore di numeri random usato da wait_client() e ask_confirmation()
srand(time(NULL));
//attende un cliente
wait_client();
//proteggo l'accesso dell'operatore al db
pthread_mutex_lock(&op_lock);
active_op++;
if (active_op==1){
pthread_mutex_lock(&db_lock);
}
pthread_mutex_unlock(&op_lock);
//controllo disponibilita'
if (check_availability()){
pthread_mutex_lock(&op_lock);
active_op--;
if (active_op==0){
pthread_mutex_unlock(&db_lock);
}
pthread_mutex_unlock(&op_lock);
//se il posto e' disponibile chiedo conferma della prenotazione
if (ask_confirmation()){
pthread_mutex_lock(&db_lock);
//avuta la conferma dal cliente, ricontrollo se il posto sia ancora libero
if (check_availability()){
//ricevuta la conferma, prenoto il posto e rilascio il lock sul db
book_seat();
pthread_mutex_unlock(&db_lock);
//confermo al cliente l'avvenuta prenotazione
confirm_booking();
}
else {
pthread_mutex_unlock(&db_lock);
printf("Ci dispiace, qualcuno ha prenotato il posto prima di lei\n");
}
}
else {
//prenotazione non confermata, rilascio il lock sul db
pthread_mutex_lock(&op_lock);
active_op--;
if (active_op==0){
pthread_mutex_unlock(&db_lock);
}
pthread_mutex_unlock(&op_lock);
printf("Ci dispiace che abbia cambiato idea, speriamo di rivederla al piu' presto!\n");
}
}
else {
pthread_mutex_lock(&op_lock);
active_op--;
if (active_op==0){
pthread_mutex_unlock(&db_lock);
}
pthread_mutex_unlock(&op_lock);
printf("Ci dispiace, il viaggio che le interessa e' gia' al completo! Speriamo di rivederla presto.\n");
break;
}
}
}
void *wait_client(){
int i;
int delay;
delay = rand();
for (i=0;i<delay;i++) {
//attendiamo un cliente!
}
}
int check_availability(){
//ritorna 1 se ci sono posti disponibili, 0 altrimenti
int availability = seats>0 ? 1 : 0;
return availability;
}
int ask_confirmation(){
//la decisione viene simulata generando un numero float random compreso tra [0;1]:
//se appartiene a [0;0.75) viene confermata la prenotazione.
int confirmation = (float)((double)rand()/(double)RAND_MAX)<0.75 ? 1:0;
return confirmation;
}
void *book_seat(){
seats--;
}
void *confirm_booking(){
printf("L'operatore %u effettua una prenotazione!\n",pthread_self());
}