-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathPrioridadeEscritor.c
208 lines (133 loc) · 4.81 KB
/
PrioridadeEscritor.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
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
#include <stdlib.h>
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
#define LEITOR 10
#define ESCRITOR 10
pthread_mutex_t bancoDados;
pthread_mutex_t mutex1_controleLeitor_1;
pthread_mutex_t mutex2_controleLeitor_2;
pthread_mutex_t mutex3_controleEscritor;
pthread_mutex_t controlePrivilegio_escritor;
int leitor_lendo;
int quant_escritor;
int num;
void lerBancoDeDados(void);
void leitorSaindo(void);
void escritorPedindoAcesso(void);
void escreverBancoDeDados(void);
void * leitor(void* quant)
{
int * id = (int*) (quant) ;
printf("O leitor %d foi criado com sucesso\n", *(id) );
while(1)
{
pthread_mutex_lock(&mutex1_controleLeitor_1); // lock para garanitr esclusividade ao lock e unlock do controlePrivilegio_escritor e que
// o mutex1_controleLeitor_1 garante que so um leitor espere o unlock do controlePrivilegio_escritor
pthread_mutex_lock(&controlePrivilegio_escritor); // block para ver se algum escritor esta escrevendo
pthread_mutex_lock(&mutex2_controleLeitor_2); // lock para alterar variavel leitor_lendo
leitor_lendo=leitor_lendo +1;
if(leitor_lendo == 1 )
{
pthread_mutex_lock(&bancoDados); // lock do primeiro leitor para area critica
}
pthread_mutex_unlock(&mutex2_controleLeitor_2); // unlock variavel leitor_lendo
pthread_mutex_unlock(&controlePrivilegio_escritor); // unlock controlePrivilegio_escritor
pthread_mutex_unlock(&mutex1_controleLeitor_1); // unlock para um proximo leitor mais ele vai ficar travado no sem_wait(r) por causa do escritor
lerBancoDeDados();
pthread_mutex_lock(&mutex2_controleLeitor_2); // lock para alterar variavel leitor_lendo
leitor_lendo=leitor_lendo -1;
if(leitor_lendo == 0)
{
pthread_mutex_unlock(&bancoDados); // unlock do ultimo leitor
}
pthread_mutex_unlock(&mutex2_controleLeitor_2); // unlock variavel leitor_lendo
leitorSaindo();
}
}
void * escritor(void* quant)
{
int * id = (int*) (quant) ;
printf("O escritor %d foi criado com sucesso\n", *(id) );
while (1)
{
escritorPedindoAcesso();
pthread_mutex_lock(&mutex3_controleEscritor); // lock para alterar variavel quant_escritor
quant_escritor = quant_escritor +1;
if(quant_escritor == 1)
{
pthread_mutex_lock(&controlePrivilegio_escritor); // lock para avisar que quer escrever bloquer os leitores
}
pthread_mutex_unlock(&mutex3_controleEscritor); // unlock variavel quant_escritor
pthread_mutex_lock(&bancoDados); // lock para area critica
escreverBancoDeDados();
pthread_mutex_unlock(&bancoDados); // unlock do escritor
pthread_mutex_lock(&mutex3_controleEscritor); // lock para alterar variavel quant_escritor
quant_escritor = quant_escritor -1;
if(quant_escritor ==0 )
{
pthread_mutex_unlock(&controlePrivilegio_escritor); // unlock para avisar que podem ler ou escrever
}
pthread_mutex_unlock(&mutex3_controleEscritor); // unlock variavel quant_escritor
int tempo;
tempo = rand() % 20;
sleep(tempo);
}
}
int main()
{
pthread_t threadsdosescritores[ESCRITOR], threadsdosleitores[LEITOR];
int i;
pthread_mutex_init(&controlePrivilegio_escritor,NULL);
pthread_mutex_init(&mutex1_controleLeitor_1,NULL);
pthread_mutex_init(&mutex2_controleLeitor_2,NULL);
pthread_mutex_init(&mutex3_controleEscritor,NULL);
pthread_mutex_init(&bancoDados,NULL);
for(i=0 ; i<ESCRITOR ; i++)
{
pthread_create(&threadsdosescritores[i],NULL,escritor ,(void*)&(i));
}
for(i=0 ; i<LEITOR ; i++)
{
int calma;
calma = rand() % 2;
pthread_create(&threadsdosleitores[i],NULL,leitor ,(void*)&(i));
sleep(calma);
}
for(i=0 ; i<ESCRITOR ; i++)
{
pthread_join(threadsdosescritores[i],NULL);
}
for(i=0 ; i<LEITOR ; i++)
{
pthread_join(threadsdosleitores[i],NULL);
}
return(0);
}
void lerBancoDeDados()
{
int tempo_de_leitura;
tempo_de_leitura = rand() % 5;
printf("Lendo o Banco de dados. Um total de %d.\n\n Lendo %d\n\n",leitor_lendo,num);
sleep(tempo_de_leitura);
}
void leitorSaindo()
{
int tempo_de_uso;
tempo_de_uso= rand() % 5;
printf("O leitor esta saindo.\n\n");
sleep(tempo_de_uso);
}
void escritorPedindoAcesso()
{
int tempo_para_pensar;
tempo_para_pensar = rand() % 10;
printf("Eu quero escrever.\n\n");
sleep(tempo_para_pensar);
}
void escreverBancoDeDados()
{
int tempo_de_escrita;
num=num+1;
printf("Escrevendo no banco de dados. \n ecrevendo %d\n\n",num);
}