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
|
que_tengo = {}
semaforos_interm = {}
for i in ingredientes:
que_tengo[i] = False
semaforos_interm[i] = threading.Semaphore(0)
interm_mutex = threading.Semaphore(1)
intermediarios = [threading.Thread(target=intermediario, args=[i]).start() for i in ingredientes]
def fumador(ingr):
while True:
semaforos_interm[ingr].acquire()
fuma(ingr)
semaforo_agente.release()
def intermediario(ingr):
otros_ingr = ingredientes[:]
otros_ingr.remove(ingr)
while True:
semaforos[ingr].acquire()
interm_mutex.acquire()
found = True
for i in otros_ingr:
if que_tengo[i]:
que_tengo[i] = False
habilitado = list(otros_ingr)
habilitado.remove(i)
semaforos_interm[habilitado[0]].release()
found = True
break
if not found:
que_tengo[ingr] = True
interm_mutex.release()
|