palitos = []
semaforos = []
-
class filosofo(threading.Thread):
- def __init__(self, numeracion, cant):
+ def __init__(self, izq, der, cant):
threading.Thread.__init__(self)
- self.id = numeracion
+ self.id = izq
self.rnd = random.Random()
self.cant = cant # cantidad de veces que va a comer
self.comi = 0 # cantidad de veces que comio
- self.derecho = False
- self.izquierdo = False
+ self.der = der
+ self.izq = izq
+ self.ambos = [False, False]
self.start()
def agarrarPalitoDerecho(self):
- if self.id+1 == len(palitos): ind = 0
- else: ind = self.id+1
- semaforos[ind].acquire()
- self.derecho = palitos[ind]
- if self.derecho:
- print 'Soy '+str(self.id)+' y agarre el palito derecho'
- else: self.derecho = False
- semaforos[ind].release()
+ semaforos[self.der].acquire()
+ palitos[self.der] = False
+ self.ambos[1] = True
+ print 'Soy '+str(self.id)+' y agarre el palito derecho'
def agarrarPalitoIzquierdo(self):
- semaforos[self.id].acquire()
- self.izquierdo = palitos[self.id]
- if self.izquierdo:
- print 'Soy '+str(self.id)+' y agarre el palito izquierdo'
- else: self.izquierdo = False
- semaforos[self.id].release()
+ semaforos[self.izq].acquire()
+ palitos[self.izq] = False
+ self.ambos[0] = True
+ print 'Soy '+str(self.id)+' y agarre el palito izquierdo'
+
+ def dejarPalitoDerecho(self):
+ palitos[self.der] = True
+ semaforos[self.der].release()
+ self.ambos[1] = False
+ print 'Soy '+str(self.id)+' y solte el palito derecho'
+
+ def dejarPalitoIzquierdo(self):
+ palitos[self.izq] = True
+ semaforos[self.izq].release()
+ self.ambos[0] = False
+ print 'Soy '+str(self.id)+' y solte el palito izquierdo'
def pensar(self):
- t = self.rnd.randint(1,5)
+ t = self.rnd.randint(2,5)
print 'Soy '+str(self.id)+' y voy a pensar durante '+str(t)+' segundos'
time.sleep(t)
def comer(self):
t = self.rnd.randint(1,5)
- if self.derecho and self.izquierdo:
- print 'Soy '+str(self.id)+' y voy a comer '+ str(t) + ' segundos'
+ if self.ambos == [True, True]:
+ print 'Soy '+str(self.id)+' y voy a comer '+str(t)+' segundos'
self.comi = self.comi + 1
self.izquierdo = self.derecho = False
time.sleep(t)
- if self.id+1 == len(palitos): ind = 0
- else: ind = self.id+1
- palitos[self.id] = True
- palitos[ind] = True
+
+ self.dejarPalitoIzquierdo()
+ self.dejarPalitoDerecho()
+
print 'Soy '+str(self.id)+' y solte los palitos'
return True
else: return False
else: return False
def run(self):
- time.sleep(self.rnd.randint(1,5))
while not self.lleno():
self.agarrarPalitoDerecho()
self.agarrarPalitoIzquierdo()
if not self.comer():
self.pensar()
- else: time.sleep(5) #comiendo
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()
+ if int(sys.argv[1]) <= 1:
+ print "Debe haber por lo menos 2 chinos"
+ sys.exit()
chinos = []
- for i in range(int(sys.argv[1])):
+ todos = int(sys.argv[1]);
+ for i in range(todos):
palitos.append(True)
semaforos.append(threading.Semaphore(1))
- chinos.append(filosofo(i,int(sys.argv[2])))
-
+ chinos.append(filosofo(i,(i+1)%todos,int(sys.argv[2])))