palitos = []
semaforos = []
+todoscomieron = 0
+class monitor(threading.Thread):
+ def __init__(self, cant):
+ threading.Thread.__init__(self)
+ self.cant = cant
+ self.start()
+ def run(self):
+ global todoscomieron
+ while todoscomieron < self.cant:
+ print 'palitos = ', palitos
+ time.sleep(1)
class filosofo(threading.Thread):
- def __init__(self, numeracion, cant):
+ def __init__(self, izq, der, cant):
threading.Thread.__init__(self)
- self.id = numeracion
+ self.id = self.izq = izq
+ self.der = der
self.rnd = random.Random()
self.cant = cant # cantidad de veces que va a comer
self.comi = 0 # cantidad de veces que comio
self.izquierdo = False
self.start()
- @synchronized('Lock')
+ @synchronized('LockTomarDerecho')
def agarrarPalitoDerecho(self):
- if self.id+1 == len(palitos): ind = 0
- else: ind = self.id+1
- self.derecho = palitos[ind]
+ self.derecho = palitos[self.der]
if self.derecho:
+ palitos[self.der] = False
print 'Soy '+str(self.id)+' y agarre el palito derecho'
- else: self.derecho = False
-
- @synchronized('Lock')
+ return True
+ else:
+ self.derecho = False
+ palitos[self.der] = True
+ return False
+
+ @synchronized('LockSoltarDerecho')
+ def dejarPalitoDerecho(self):
+ self.derecho = False
+ palitos[self.der] = True
+ print 'Soy '+str(self.id)+' y solte el palito derecho'
+
+ @synchronized('LockIzquierdo')
def agarrarPalitoIzquierdo(self):
- self.izquierdo = palitos[self.id]
+ self.izquierdo = palitos[self.izq]
if self.izquierdo:
+ palitos[self.izq] = False
print 'Soy '+str(self.id)+' y agarre el palito izquierdo'
- else: self.izquierdo = False
+ return True
+ else:
+ self.izquierdo = False
+ palitos[self.izq] = True
+ return False
def pensar(self):
- t = self.rnd.randint(0,5)
+ t = self.rnd.randint(1,5)
print 'Soy '+str(self.id)+' y voy a pensar durante '+str(t)+' segundos'
time.sleep(t)
def comer(self):
if self.derecho and self.izquierdo:
- print 'Soy '+str(self.id)+' y voy a comer'
+ t = self.rnd.randint(1,5)
+ print 'Soy '+str(self.id)+' y voy a comer durante '+str(t)+' segundos'
self.comi = self.comi + 1
- self.izquierdo = self.derecho = False
- time.sleep(self.rnd.randint(0,5))
- if self.id+1 == len(palitos): ind = 0
- else: ind = self.id+1
- palitos[self.id] = True
- palitos[ind] = True
- 'Soy '+str(self.id)+' y solte los palitos'
- return True
- else: return False
+ time.sleep(t)
+ self.derecho = self.izquierdo = False
+ palitos[self.izq] = True
+ palitos[self.der] = True
+ print 'Soy '+str(self.id)+' y solte los palitos'
def lleno(self):
- if self.cant == self.comi: return True
+ global todoscomieron
+ if self.cant == self.comi:
+ todoscomieron = todoscomieron + 1
+ return True
else: return False
def run(self):
while not self.lleno():
- self.agarrarPalitoDerecho()
- self.agarrarPalitoIzquierdo()
- if not self.comer():
- self.pensar()
- else: time.sleep(5) #comiendo
-
+ self.pensar()
+ if self.agarrarPalitoDerecho():
+ self.agarrarPalitoIzquierdo()
+ else:
+ self.dejarPalitoDerecho()
+ self.comer()
+
if __name__ == '__main__':
if len(sys.argv) < 3:
print "Modo de uso: "+ str(sys.argv[0]) + "<Cantidad de chinos invitados a la fiesta> <Cantidad de rondas que estara pensando o comiendo cada chino>"
- exit
-
+ sys.exit()
+
+# mo = monitor(int(sys.argv[1]))
chinos = []
for i in range(int(sys.argv[1])):
palitos.append(True)
- chinos.append(filosofo(i,int(sys.argv[2])))
+ chinos.append(filosofo(i,(i+1)%int(sys.argv[1]),int(sys.argv[2])))