-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtmp2.c
More file actions
100 lines (78 loc) · 2.51 KB
/
tmp2.c
File metadata and controls
100 lines (78 loc) · 2.51 KB
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
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#define NUM_CLIENTS 7
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t empty = PTHREAD_COND_INITIALIZER;
pthread_cond_t fill = PTHREAD_COND_INITIALIZER;
int *account[NUM_CLIENTS];
void *operations(void *threadid);
int main() {
pthread_t threads[NUM_CLIENTS];
int *ids[NUM_CLIENTS];
int i;
for(i = 0; i < NUM_CLIENTS; i++) {
ids[i] = (int *) malloc(sizeof(int));
account[i] = (int *) malloc(sizeof(int));
*ids[i] = i;
*account[i] = 1000;
pthread_create(&threads[i], NULL, operations, (void *) ids[i]);
}
for(int i = 0; i < NUM_CLIENTS; i++) {
pthread_join(threads[i], NULL);
}
pthread_exit(NULL);
}
int put(int threadid){
int v = rand() % 5000;
pthread_mutex_lock(&mutex);
// while(items == BUFFER_SIZE) {
// pthread_cond_wait(&empty, &mutex);
// }
*account[threadid] += v;
// if(*account[threadid] == 1) {
// pthread_cond_broadcast(&fill);
// }
pthread_mutex_unlock(&mutex);
return v;
}
int get(int threadid) {
int saque = rand() % 1000;
pthread_mutex_lock(&mutex);
if(saque > *account[threadid]) {
printf("Saldo insuficiente\n");
pthread_exit(NULL);
}
// while(*account[threadid] == 0) {
// pthread_cond_wait(&fill, &mutex);
// }
*account[threadid] -= saque;
//if(items == BUFFER_SIZE - 1){ pthread_cond_signal(&empty); }
pthread_mutex_unlock(&mutex);
return saque;
}
void *operations(void *threadid) {
int operation;
operation = rand() % 3; //printf("%d\n", operation);
switch(operation) {
case 0: // Saque
printf("Cliente %d sacando: ", *((int*) threadid));
printf("%d\n", get(*((int *) threadid)));
printf("Novo saldo: %d\n", *account[*((int *) threadid)]);
break;
case 1: // Depósito
printf("Cliente %d depositando: ", *((int*) threadid));
printf("%d\n", put(*((int *) threadid)));
printf("Novo saldo: %d\n", *account[*((int *) threadid)]);
break;
case 2: // Consultar Saldo
pthread_mutex_lock(&mutex);
printf("Cliente %d, seu saldo atual eh: %d\n", *((int *) threadid), *account[*((int *) threadid)]);
pthread_mutex_unlock(&mutex);
break;
default:
printf("Operacao invalida\n");
break;
}
pthread_exit(NULL);
}