-
Notifications
You must be signed in to change notification settings - Fork 0
/
Inventario.cpp
64 lines (56 loc) · 1.6 KB
/
Inventario.cpp
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
#include "Inventario.h"
#include <unistd.h>
void Inventario::agregarRecurso(const char recurso){
std::unique_lock<std::mutex> lk(m);
if (recurso == 'T') cant_trigo++;
if (recurso == 'M') cant_madera++;
if (recurso == 'H') cant_hierro++;
if (recurso == 'C') cant_carbon++;
cv.notify_all();
}
void Inventario::extraerCocinero(){
std::unique_lock<std::mutex> lk(m);
while (!(cant_carbon >= 1 && cant_trigo >= 2)){
if (esta_cerrado){
throw InventarioEstaCerradoException();
}
cv.wait(lk);
}
cant_trigo -= 2;
cant_carbon -= 1;
}
void Inventario::extraerCarpintero(){
std::unique_lock<std::mutex> lk(m);
while (!(cant_madera >= 3 && cant_hierro >= 1)){
if (esta_cerrado){
throw InventarioEstaCerradoException();
}
cv.wait(lk);
}
cant_madera -= 3;
cant_hierro -= 1;
}
void Inventario::extraerArmero(){
std::unique_lock<std::mutex> lk(m);
while (!(cant_carbon >= 2 && cant_hierro >= 2)){
if (esta_cerrado){
throw InventarioEstaCerradoException();
}
cv.wait(lk);
}
cant_carbon -= 2;
cant_hierro -= 2;
}
void Inventario::cerrar(){
std::unique_lock<std::mutex> lk(m);
esta_cerrado = true;
cv.notify_all();
}
void Inventario::printear() const {
std::cout << "Recursos restantes:\n";
std::cout << " - Trigo: " << cant_trigo << "\n";
std::cout << " - Madera: " << cant_madera << "\n";
std::cout << " - Carbon: " << cant_carbon << "\n";
std::cout << " - Hierro: " << cant_hierro << "\n";
std::cout << "\n";
}