-
Notifications
You must be signed in to change notification settings - Fork 0
/
q6.c
134 lines (98 loc) · 3.27 KB
/
q6.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
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#define TAM 10
//Inicializando os mutexes de forma estática.
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_t db = PTHREAD_MUTEX_INITIALIZER;
int *regiaocritica;
int leitoresRegiaoCritica;
void* fazEscrita(void*args){
//Fazendo cast do elemento usado como argumento para cada thread.
int i = (*(int*)args);
int posicao;
char letraAleatoria;
while(1){
//Travando a região crítica.
pthread_mutex_lock(&mutex);
letraAleatoria = 'A' + (random() % 26);
posicao = rand() % (TAM - 1);
regiaocritica[posicao] = letraAleatoria;
printf("A thread[%d] esta escrevendo a letra [%c] na posicao [%d].\n", i, letraAleatoria, posicao);
//Destravando a região crítica.
pthread_mutex_unlock(&mutex);
//Fornecendo um delay somente para visualização.
system("sleep 01");
}
}
void* fazLeitura(void*args){
//Fazendo cast do elemento usado como argumento para cada thread.
int i = (*(int*)args);
int posicao;
while(1){
pthread_mutex_lock(&mutex);
leitoresRegiaoCritica++;
if(leitoresRegiaoCritica == 1){
pthread_mutex_lock(&db);
}
pthread_mutex_unlock(&mutex);
posicao = rand()%(TAM - 1);
printf("A thread[%d] esta fazendo a leitura na posicao [%d].\n", i, posicao);
pthread_mutex_lock(&mutex);
leitoresRegiaoCritica--;
if(leitoresRegiaoCritica == 0){
pthread_mutex_unlock(&db);
}
pthread_mutex_unlock(&mutex);
//Fornecendo um delay somente para visualização.
system("sleep 01");
}
}
int main(){
int qtdLeitoras, qtdEscritoras;
int i;
pthread_t *leitoras;
pthread_t *escritoras;
int **idLeitoras;
int **idEscritoras;
printf("Digite a quantidade de leitoras: ");
scanf("%d", &qtdLeitoras);
printf("Digite a quantidade de escritoras: ");
scanf("%d", &qtdEscritoras);
//Alocando o vetor de ids para as threads leitoras e escritoras.
idLeitoras = (int**) malloc(qtdLeitoras * sizeof(int*));
idEscritoras = (int**) malloc(qtdEscritoras * sizeof(int*));
//Alocando o vetor de ids para as threads leitoras e escritoras.
leitoras = (pthread_t*) malloc(qtdLeitoras * sizeof(pthread_t));
escritoras = (pthread_t*) malloc(qtdEscritoras * sizeof(pthread_t));
//Alocando o vetor de região crítica.
regiaocritica = (int*) malloc(TAM * sizeof(int));
//Criando as threads leitoras.
for(i = 0; i < qtdLeitoras; i++){
//Alocação o vetor de ids.
idLeitoras[i] = (int*) malloc(sizeof(int));
*idLeitoras[i] = i;
//Criando as thereads.
int t = pthread_create(&leitoras[i], NULL, fazLeitura,(void *)idLeitoras[i]);
//Identificando se a criação de cada thread foi bem sucessida.
if(t){
printf("Erro na criacao das threads leitoras!\n");
exit(0);
}
}
//Criando as threads escritoras.
for(i = 0; i < qtdEscritoras; i++){
//Alocando o vetor de ids.
idEscritoras[i] = (int *) malloc(sizeof(int));
*idEscritoras[i] = i;
//Criando as threads.
int t = pthread_create(&escritoras[i], NULL, fazEscrita,(void *)idEscritoras[i]);
//Identificando se cada thread foi bem sucessida.
if(t){
printf("Erro na criacao das threads escritoras!\n");
exit(0);
}
}
free(regiaocritica);
pthread_exit(NULL);
}